home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1993…ch: Other People's Memory / ADC Developer CD (1993-03) (''Other People's Memory'')_iso / Dev.CD Mar 93.iso / Technical Documentation / Mac Tech Notes (DocViewer) / TN-QuickTime / TN-QuickTime
Encoding:
Text File  |  1993-01-05  |  106.2 KB  |  177 lines  |  [ONLN/HLX2]

  1. Image Compression Manager Q&As
  2. QuickTime    M.QT.ImageCompr.Q&As
  3. Revised by:    Developer Support Center    October 1992
  4. Written by:    Developer Support Center    October 1990
  5. This Technical Note contains a collection of Q&As relating to a specific topic—questions you’ve sent the Developer Support Center (DSC) along with answers from the DSC engineers. While DSC engineers have checked the Q&A content for accuracy, the Q&A Technical Notes don’t have the editing and organization of other Technical Notes. The Q&A function is to get new technical information and updates to you quickly, saving the polish for when the information migrates into reference manuals.
  6. Q&As are now included with Technical Notes to make access to technical updates easier for you. If you have comments or suggestions about Q&A content or distribution, please let us know by sending an AppleLink to DEVFEEDBACK. Apple Partners may send technical questions about Q&A content to DEVSUPPORT for resolution.
  7. New Q&As and Q&As revised this month are marked with a bar in the side margin.
  8. QuickTime fills in image descriptor when data is compressed
  9. Written:    
  10. Last reviewed:    
  11. When I send compressed images over Ethernet, CompressSequenceBegin doesn’t fill in the ImageDescription, which is needed at the other end of the conference link to DecompressSequenceBegin. Is this a bug?
  12. ___
  13. CompressSequenceBegin doesn’t actually modify the handle that you pass. Instead, QuickTime makes a note of the handle that’s passed and doesn’t actually modify the contents until the first call that actually compresses data, such as CompressSequenceFrame. At that point, the handle will be changed.
  14. If you can postpone dealing with the image descriptor until after the first call that compresses data, whatever you are writing should work just fine.
  15. Decompressing to partial window: Bug & workaround 
  16. Written:    6/18/92
  17. Last reviewed:    9/15/92
  18. Under System 7, decompressing directly to a window that is partially “off the screen” (that is, not completely visible) results in a -50 (invalid param) QuickTime error. We can special case when windows are off the screen and decompress into an offscreen GWorld but we would prefer a fix to either QuickTime or System 7.
  19. ___
  20. The problem you are having is due to a bug in the Image Compression Manager. It fails to clear QDError when starting a decompression job and later checks it to see if it is OK to continue the operation. Something else is setting QDErr and your call fails.
  21. The solution that you can implement now consists of clearing QDErr before calling any of the decompression routines. You can accomplish this by calling QDError (which clears the error after it passes the current value to you) or zeroing the low mem QDerr (0xD6E) by hand.
  22. Future versions of QuickTime will have the fix and will not require that you work around the problem.
  23. Movie Toolbox Q&As
  24. QuickTime    M.QT.MovieTB.Q&As
  25. Revised by:    Developer Support Center    December 1992
  26. Written by:    Developer Support Center    October 1990
  27. This Technical Note contains a collection of Q&As relating to a specific topic—questions you’ve sent the Developer Support Center (DSC) along with answers from the DSC engineers. While DSC engineers have checked the Q&A content for accuracy, the Q&A Technical Notes don’t have the editing and organization of other Technical Notes. The Q&A function is to get new technical information and updates to you quickly, saving the polish for when the information migrates into reference manuals.
  28. Q&As are now included with Technical Notes to make access to technical updates easier for you. If you have comments or suggestions about Q&A content or distribution, please let us know by sending an AppleLink to DEVFEEDBACK. Apple Partners may send technical questions about Q&A content to DEVSUPPORT for resolution.
  29. New Q&As this month:
  30. How to get more recent MovieRecorder version
  31. Getting movie from movie controller component
  32. Determining QuickDraw video media pixel depth
  33. How to get more recent MovieRecorder version
  34. Date written:    9/21/92
  35. Last reviewed:    11/1/92
  36. I purchased the QuickTime Developer’s Kit, which contains the Starter’s Kit with MovieRecorder version 1.0a1. This seems to have a lot of bugs. How can I get a later version of MovieRecorder that works with QuickTime 1.0?
  37. ___
  38. The only way to obtain the current version of MovieRecorder (version 1.0 final) is to purchase the QuickTime Starter Kit. Because the Starter Kit is focused on end users, it is available through your local Apple reseller. It’s not available through APDA.
  39. Getting movie from movie controller component
  40. Date written:    7/22/92
  41. Last reviewed:    11/1/92
  42. Is there a way that the action filter proc of a QuickTime movie controller component can have a user reference field so that I can know which movie-“object” the movie controller is referring to? There are local variables associated with a particular movie that I would like to access from the action filter proc; currently there’s no way to reference back to the variables in my program except through globals.
  43. ___
  44. The movie controller action filter does not have a reference field. As a workaround, you might store your movie data in the userData area of the movie and then call MCGetMovie from an action filter. Once you get a reference to the movie, you can then retrieve the user data. Here are code snippets to do it:
  45.   Handle movieNameH;
  46.   Str255  movieName;
  47.   Movie   coolMovie;
  48.   // Get coolMovie
  49.   movieNameH = NewHandle(sizeof(Str255));
  50.   strcpy(*movieNameH,PtoCstr(movieName));
  51.   AddUserData(GetMovieUserData(coolMovie),movieNameH ,'©nam');
  52. pascal Boolean myMCActionFilter( MovieController mc, short *action,long *params)
  53. {
  54. Handle    movieName;
  55. Movie     coolMovie;
  56. UserData  u;
  57. movieName = NewHandle(sizeof(Handle));
  58. coolMovie = MCGetMovie(mc);
  59. u = GetMovieUserData(coolMovie);
  60. GetUserData(u,movieName,'©nam',1);
  61. return false;  // let mc component handle all actions
  62. }
  63. Determining QuickDraw video media pixel depth
  64. Date written:    8/18/92
  65. Last reviewed:    11/1/92
  66. How do I get the pixel depth of a QuickTime video media for a given track?
  67. ___
  68. The following sample code does the trick:
  69. #include <QuickDraw.h>
  70. #include <Movies.h>
  71. #include <ImageCompression.h>
  72. Media GetFirstVideoMedia(Movie coolMovie,long *trackIndex)
  73. {
  74.   Track  coolTrack=nil;
  75.   Media  coolMedia=nil;
  76.   long  numTracks;
  77.   OSType  mediaType;
  78.   numTracks = GetMovieTrackCount(coolMovie);
  79.   for (*trackIndex=1; *trackIndex <= numTracks; (*trackIndex)++) {
  80.     coolTrack = GetMovieIndTrack(coolMovie,*trackIndex);
  81.     if (coolTrack) coolMedia = GetTrackMedia(coolTrack);
  82.     if (coolMedia) GetMediaHandlerDescription(coolMedia,&mediaType,nil,nil);
  83.     if (mediaType == VideoMediaType) return coolMedia;
  84.   }
  85.   *trackIndex=0;  // trackIndex can’t be 0
  86.   return nil;    // went through all tracks and no video
  87. }
  88. short GetFirstVideoTrackPixelDepth(Movie coolMovie)
  89. {
  90. SampleDescriptionHandle imageDescH=(SampleDescriptionHandle)NewHandle(sizeof(Handle));
  91. long           trackIndex=0;
  92. Media          coolMedia=nil;
  93. coolMedia = GetFirstVideoMedia(coolMovie,&trackIndex);
  94. if (!trackIndex || !coolMedia) return -1;  // we need both
  95. GetMediaSampleDescription(coolMedia,trackIndex,imageDescH);
  96. return (*(ImageDescriptionHandle)imageDescH)->depth;
  97. }
  98. QuickTime Movie Toolbox “globals” are stored in system heap
  99. Written:    
  100. Last reviewed:    
  101. According to the QuickTime Movie Toolbox documentation, “The Movie Toolbox maintains a set of global variables for every application using it.” How much global memory is required? Our application is shy on global data space.
  102. ___
  103. The information maintained is not kept with the application’s global variables. The handle created by the EnterMovies call is stored in the system heap, not in the application heap. You don’t have to worry about how much space to allocate in your application. This initialization does not affect your A5 world either.
  104. EnterMovies initializes everything, including setting up the necessary data space and creating a handle to it. When you’re done, be sure to make a call to ExitMovies to clean up the QuickTime data.
  105. If an application makes multiple calls to EnterMovies, a different set of “globals,” or data area, is set up for each call. A call to ExitMovies should be made before exiting the area that made the call to EnterMovies. For example, an application that uses QuickTime will call EnterMovies and set up the QuickTime world. Then an external may be called upon that wants to use QuickTime. This external would have to make a call to EnterMovies to set up another QuickTime world for its use. Before leaving, the external should call ExitMovies to clean up after itself. The application can then continue to use QuickTime with the original world it set up.
  106. QuickTime file audio retrieval
  107. Written:    
  108. Last reviewed:    
  109. How can I retrieve audio from QuickTime files in 1-second chunks? I need a sound equivalent of GetMoviePict.
  110. ___
  111. You will have to write your own audio extraction routine. The Movie Toolbox does not provide a simple call to, say, GetMovieSound(movie, time, duration). To get around this limitation, use GetMediaSample and collect the sound data by hand. The format for the final result is up to you; in the case of a 'snd ' resource you’d create the handle fill in the other fields and put the sample data in it.
  112. You can use the QuickTime SoundDescription data structure (1) to find frequency, format, and other details, (2) to help you figure out how many samples you need for a second, and (3) to fill in the resource data fields.
  113. Of course, this scheme gets more complicated in the case when there are more than a single sound track. The best source of information on sound resources and such is the Sound Manager chapter in Inside Macintosh Volume VI.
  114. Current QuickTime supports only video and sound media
  115. Written:    
  116. Last reviewed:    
  117. Can I add a media to a QuickTime movie that is not video or audio? If so is there anything special I need to do to add text notes that can potentially accompany each frame in my “movie,” which can follow the video frames if a user edits the movie in any way.
  118. ___
  119. The current release of QuickTime only allows for video and sound media. There is no way to install your own type. This is a high QuickTime priority and is likely to make it in a future release, but at the present there is no mechanism to do it.
  120. Status of rotating matrix support
  121. Written:    
  122. Last reviewed:    
  123. What is the status of RotateMatrix and its use with SetMovieMatrix and SetTrackMatrix?
  124. ___
  125. RotateMatrix works fine. But rotating matrixes are not supported for movies or images. So, although RotateMatrix will give you the correct mathematical result, unless you are using the matrix to transform something else (as with TransformFixedPoints) it has little use.
  126. Rotation is a very important future direction that will get more attention in the future.
  127. How to get the first video frame
  128. Written:    
  129. Last reviewed:    
  130. Stepping through QuickTime movie video frames in the order they appear in the movie is simple using GetMovieNextInterestingTime, except for getting the first frame. If I set the time to zero and rate to 1, then I get the second frame, not the first. In addition, the video may start later than at 0. How do you suggest finding this first frame of video?
  131. ___
  132. To get the first frame in the conditions you describe you have to pass the flag nextTimeEdgeOK = $2000 to GetMovieInterestingTime. What this flag does is to make the call return the current interesting time instead of the next, if the current time is an interesting time. You need to do this since there is no way to go negative and then ask for the next interesting time.
  133. QuickTime interfaces for Think Pascal
  134. Written:    
  135. Last reviewed:    
  136. Has Apple created QuickTime headers/interfaces for Think Pascal? The MPW Pascal headers don’t seem to be compatible.
  137. ___
  138. There are no Think Pascal interfaces, but your Pascal Package comes with a program called Pascal Source Converter, which converts MPW Pascal sources to Think. This should be all you need to be able to use the provided interfaces with your favorite development package.
  139. Standard controller with MCCut or MCClear
  140. Written:    
  141. Last reviewed:    
  142. When I select all frames, then do an MCCut or MCClear, the standard controller gets larger and redraws itself at the top of the movie. Is this a situation I should be prepared to handle or a bug? Does the controller behave strangely when the selectionTime of a movie is -1 or when the duration of the movie is 0?
  143. ___
  144. The behavior you are observing is to be expected if the controller is attached to the movie. In this case, the controller goes to wherever the bottom-left corner of the movie box takes it. If the movie loses all of its “visible” parts, the movie controller will jump to the top of the window.
  145. The only way to get around this is to detach the controller when the movie box is empty; this is also something to keep in mind for the cases when the movie contains only sound, since pure sound movies have no dimensions.
  146. QuickTime and sound channel deallocation
  147. Written:    
  148. Last reviewed:    
  149. Our QuickTime application gets a Sound Manager error -201 after playing movies in succession, apparently because sound channels used in the previous movies have not been reclaimed. How does QuickTime decide to deallocate sound channels? It doesn’t seem to happen in my “while (!IsMovieDone(theMovie) && !Button()” play loop.
  150. ___
  151. Sound channels are released by active movies when they notice that some other movie needs them. This is currently only done at MoviesTask time. Before entering your loop to play a single movie, you can do one or both of the following:
  152. • Preroll the movie you are about to play and check the error. If preroll returns -201 then do a MoviesTask(0,0) to give the other active movies a chance to give up their sound channels. A subsequent preroll of theMovie should return noErr.
  153. • SetMovieActive(othermovies, false). Deactivate the movies that you aren’t playing to force them to give up their resources.
  154. Clipping QuickTime movie posters
  155. Written:    
  156. Last reviewed:    
  157. Our application uses the movie poster as a still frame in a cell, similar to using a PICT. If a user sizes the cell width so it’s narrower than the poster, even though we clip the drawing to the cell size, QuickTime posters draw their full width, writing over whatever is in the way. Pictures clip through DrawPicture; why doesn’t ShowMoviePoster stay within clip region?
  158. ___
  159. ShowMoviePoster, as well as the movie and preview showing calls, uses the movie clipping characteristics rather than the destination port cliprgn. You must set the movie’s clip to obtain the results you want. An easier way to do this is to get the picture for the poster, by calling GetMoviePosterPict, and then simply use DrawPicture to display the poster. Because this is just a picture, the clip region of the port is honored. This way you don’t need different code for movies and pictures.
  160. PutMovieIntoHandle and data forks
  161. Written:    
  162. Last reviewed:    
  163. I save PICTs to my document’s data fork by writing the contents of the PicHandle. To save movies, do I convert the movie to a handle, and then save that like I would with PICTs? I just want the file references, not the data itself.
  164. ___
  165. To save movies that are suitable for storage in a file, use PutMovieIntoHandle. The result of this call can then be saved in the data fork of your files, and then you can call NewMovieFromHandle to reconstruct the movie for playback or editing.
  166. You should also read the documentation regarding Movie Toolbox FlattenMovie, which creates a file that contains the 'moov' resource and the data all in the data fork. The advantage here is that the movie file you create using FlattenMovie can be read by any other QuickTime-capable application.
  167. SetMovieRate and controlling movie playback rate
  168. Written:    
  169. Last reviewed:    
  170. QuickTime is a joy! But I’ve run aground with SetMovieRate. I am trying to change the rate at which a movie plays back, but if I call SetMovieRate the movie starts playing immediately, the controller goes wild and the next time I hit the play button it ignores the previous rate.
  171. ___
  172. SetMovieRate takes effect immediately; that’s why the movie starts playing as soon as you make the call, with a rate other than zero. Also, calling SetMovieRate behind the controller’s back can only cause confusion because you are changing the state of the movie without letting the movie controller know about the change. Note that in normal operation the movie controller plays back movies at the standard speed, rate = 1; this is the current behavior. It is possible that in a future release the movie controller will use the rate the movie was saved with or the one set with SetPreferredMovieRate. 
  173. A little-known fact is that the standard controller does contain a primitive mechanism for controlling the rate of playback. If you hold the control key down and then click the mouse over the stepping buttons, you can, for example, play the movie backwards. Furthermore, if you hold the mouse down you’ll get a slider control that does let you play the movie at different rates backward or forward.
  174. The slider provided by the standard controller is not intended to set the rate, so if you play once at low speed the rate does not stick and, as you have found, the next time you click on the play button you go back to the normal speed. If you need the selected rate to remain for the session, you’ll have to provide your own method of selection.
  175. Once you know your desired speed, you’ll need to provide your own filter procedure and install it calling MCSetActionFilter. Upon receiving any mcActionPlay actions for rate changes, you’ll need to call SetMovieRate to set the movie in motion at the desired rate (and return true). Using a filter proc is the legal way of doing this because the controller can keep in sync with the actions regardless of the fact that it’s your code that actually affects the action.
  176. Note that you will have to do some extra work to mimic the normal behavior of the standard controller. For example, when you’re at the end of the movie and the user hits the play button, the controller goes back to the beginning and plays the movie.
  177. QuickTime track and movie sound volume
  178. Written:    
  179. Last reviewed:    
  180. What do the values of a movie’s or track’s volume represent? Is there no way to make a track louder?
  181. __
  182. Here’s the scoop:
  183. The volume is described as a small fract 8:8 and its values go from -1 to 1 with negative values as placeholders. The maximum volume you can get is 0x0100 with the minimum being 0 (or any negative value). The advantage of using negative volumes is that you can turn off sound while maintaining the level of volume. For example, -1 and 0 both equate to no volume, but the -1 implies that 1 should be the volume when sound is turned back on, whereas the 0 does not.
  184. The volume for a track is scaled to the movie’s volume, and the movie’s volume is scaled to the value the user specifies for the speaker volume using the Sound control panel. This means that the movie volume represents the maximum loudness of any track in the movie.
  185. QuickTime 1.0 FS6Patch elucidation
  186. Written:    
  187. Last reviewed:    
  188. The FS6Patch description in the QuickTime 1.0 CD Read Me file says, “There is a known bug with HFS on System 6.” What specifically is this bug? According to the Read Me file, “The exact situation under which the problem occurs is somewhat rare.” What is the exact situation? “If the patch is not necessary, it will not install itself.” What criteria is used to determine necessity?
  189. ___
  190. When closing or flushing a file that has multiple open paths to a given fork, it is possible that the blocks marked as available for the other paths can also be allocated to the other fork. If this happens before the other paths are closed, blocks will be mapped to more than one fork, potentially trashing at least one of them.
  191. The condition that can trigger this condition is multiple writeable paths to the same fork. Once this is satisfied you would need to make some changes to the fork, close the path, use any of the other paths to modify the fork, access the other fork and modify data. If all these things happen you could see the damage to one of the forks (the second-to-last being accessed).
  192. The code that loads the patch checks the system first; the range where the patch is used is 6.0.4 < system < 7.0. The version of the ROM is also used to decide when to install. If the ROM indicates the machine is later than the Macintosh IIfx, then a fix in ROM is assumed. The last check is to see if the code being patched is already in RAM (the assumption is that being in RAM means fixed). If so, the patch doesn’t get used.
  193. QuickTime alias and FSSpec system services under System 6
  194. Written:    
  195. Last reviewed:    
  196. I recall reading that QuickTime includes an implementation of the Alias Manager for System 6, but I haven’t found any precise description of just what is included. Is it a bare minimum to support QuickTime? Or is the full Alias Manager there? Also, is there any way I can use the FSSpec interface to the File Manager, or must I revert to the System 6 interface?
  197. ___
  198. Here is some information on the alias and FSSpec system services that QuickTime supplies under System 6:
  199. 1. QuickTime support for aliases on System 6:
  200. Most of the Alias Manager is available, with these few exceptions:
  201. •    NewAlias will accept a fromFile parameter, but it never creates a relative alias.
  202. •    NewAliasMinimalFromFullPath is not available.
  203. •    ResolveAlias will accept a fromFile parameter, but it ignores it.
  204. •    ResolveAliasFile is not present.
  205. •    MatchAlias may be called, but the kARMSearchMore, kARMSearchRelFirst, and kARMMultVols flags are not available. If you pass them in, they will be ignored. Furthermore, if you pass in a matchProc, it will never be called.
  206. •    UpdateAlias will accept a fromFile parameter, but ignores it.
  207. •    The System 6 Alias Manager will not mount network volumes.
  208. So to summarize, on System 6 the Alias Manager doesn’t handle relative aliases, multiple volume searches, searchMore searches, and network volume mounting.
  209. On the good side, nearly all calls are present. Aliases created on System 6 are compatible with System 7 aliases. And aliases made on System 7 will work on System 6.
  210. Unfortunately, QuickTime does not currently install an Alias Manager Gestalt selector as it is only a partial implementation. You can check for the Alias Manager using Gestalt and if it is not present, look for QuickTime (using Gestalt) and if QuickTime is present, assume you have an Alias Manager, subject to the limitations above.
  211. 2. FSp file system calls and System 6
  212. QuickTime also makes extensive use of the FSSpec data structure introduced in the System 7 File Manager. Nearly all the FSSpec calls are available on System 6 when QuickTime is installed. The following calls are available on System 6, and should behave as documented for System 7:
  213.     FSMakeFSSpec
  214.     FSpOpenDF
  215.     FSpOpenRF
  216.     FSpCreate
  217.     FSpDirCreate
  218.     FSpDelete
  219.     FSpGetFInfo
  220.     FSpSetFInfo
  221.     FSpSetFLock
  222.     FSpRstFLock
  223.     FSpRename
  224.     FSpCatMove
  225.     FSpOpenResFile
  226.     FSpCreateResFile
  227.     FSpGetCatInfo
  228. The following call is not available when using the QuickTime System 6 version of the FSp calls:
  229.     FSpExchangeFiles
  230. Again, the Gestalt selector for the FSp calls is not installed when QuickTime is there. This means that the gestaltFSAttr Gestalt selector may not be present, and gestaltHasFSSpecCalls may not be set, even if gestaltFSAttr is present.
  231. 'pnot' resource format for QuickTime-like preview in dialog box
  232. Written:    
  233. Last reviewed:    
  234. I would like to implement the preview/thumbnail feature in the Standard File dialog, just like the extension included with QuickTime. Is that code available separate from QuickTime? If not, could I at least get information on how the preview is created?
  235. ___
  236. To implement your own preview/thumbnail feature, simply duplicate the Standard File dialog, add the necessary 'DITL' resources, and install a custom filter procedure for handling preview commands. On the System 7 CD there’s an example, StdFileSample, that shows exactly how to create a custom file dialog. The Macintosh Technical Note “Customizing Standard File” (formerly #47) describes how to do this as well. For generating and displaying the preview, you can use the following PreviewResourceRecord, found at the end of the ImageCompression.h file:
  237. struct PreviewResourceRecord {
  238.     unsigned long        modDate;
  239.     short                    version;
  240.     OSType                resType;
  241.     short                    resID;
  242. };
  243. typedef struct PreviewResourceRecord PreviewResourceRecord;
  244. typedef PreviewResourceRecord *PreviewResourcePtr, **PreviewResource;
  245. This is the format for the 'pnot' resource, which defines the preview for the movie file, usually pointing to a 'PICT' resource. It’s all you need to generate QuickTime-compatible preview without using QuickTime.
  246. MCSetClip and clipping with the movie controller
  247. Written:    
  248. Last reviewed:    
  249. I use SetMovieDisplayClipRgn to set my movie clip, but the movie doesn’t obey my clipping. Does the movie controller component ignore this clipping?
  250. ___
  251. You probably are directly modifying a movie that is attached to a controller without notifying the controller of the changes. The controller uses the display clip for its own purposes, such as for badges.
  252. If you want to do clipping with the movie controller you must use MCSetClip. MCSetClip takes two regions. The first clips both the movie and the controller. The second clips just the movie, and is equivalent to the movie display clip. If both clips are set, the controller does the right thing and merges them as appropriate. If you don’t want one or the other of the clips, set them to zero.
  253. In general, if you are going to do something to a movie that is attached to a controller you must either do it through the controller, using the action calls, or you must call MCMovieChanged. Otherwise, the controller would need to constantly poll the movie to see if its state changed. Clearly this would be Evil and Slow.
  254. Problem with disabling a movie video track
  255. Written:    5/29/92
  256. Last reviewed:    9/15/92
  257. When I disable a track in a movie, another random track becomes disabled as well. Is this a QuickTime bug?
  258. ___
  259. Yes, this problem will be fixed in the next QuickTime release. But, there’s no apparent workaround in the meantime. You’ll need to remove the track since disable doesn’t work.
  260. Determining whether a movie is set to loop or not
  261. Written:    8/11/92
  262. Last reviewed:    9/15/92
  263. How does Simple Player determine whether a movie is set to loop or not? Movie files that are set to loop seem to have a string of 'LOOP' at the end of the 'moov' resource. Does Simple Player check 'LOOP'?
  264. ___
  265. Simple Player identifies whether movies are set to loop by looking within the user data atoms for the 'LOOP' atom, as you’ve noticed. It’s a 4-byte Boolean in which a value of 1 means standard looping and a value of 0 means palindrome looping. Your applications should add the user data 'LOOP' atom to the end of the movie when a user chooses to loop. We recommend this method as a standard mechanism for determining the looping status of a movie. If the 'LOOP' atom doesn’t exist, there’s no looping. The calls you need to access this information are GetMovieUserData, GetUserData, AddUserData, and RemoveUserData, as defined in the Movie Toolbox chapter of the QuickTime documentation.
  266. Determining QuickDraw video media pixel depth
  267. Written:    8/18/92
  268. Last reviewed:    10/11/92
  269. How do I get the pixel depth of a QuickTime video media for a given track?
  270. ___
  271. The following sample code does the trick:
  272. #include <QuickDraw.h>
  273. #include <Movies.h>
  274. #include <ImageCompression.h>
  275. Media GetFirstVideoMedia(Movie coolMovie,long *trackIndex)
  276. {
  277.   Track  coolTrack=nil;
  278.   Media  coolMedia=nil;
  279.   long  numTracks;
  280.   OSType  mediaType;
  281.   numTracks = GetMovieTrackCount(coolMovie);
  282.   for (*trackIndex=1; *trackIndex <= numTracks; (*trackIndex)++) {
  283.     coolTrack = GetMovieIndTrack(coolMovie,*trackIndex);
  284.     if (coolTrack) coolMedia = GetTrackMedia(coolTrack);
  285.     if (coolMedia) GetMediaHandlerDescription(coolMedia,&mediaType,nil,nil);
  286.     if (mediaType == VideoMediaType) return coolMedia;
  287.   }
  288.   *trackIndex=0;  // trackIndex can’t be 0
  289.   return nil;    // went through all tracks and no video
  290. }
  291. short GetFirstVideoTrackPixelDepth(Movie coolMovie)
  292. {
  293. SampleDescriptionHandle imageDescH=(SampleDescriptionHandle)NewHandle(sizeof(Handle));
  294. long           trackIndex=0;
  295. Media          coolMedia=nil;
  296. coolMedia = GetFirstVideoMedia(coolMovie,&trackIndex);
  297. if (!trackIndex || !coolMedia) return -1;  // we need both
  298. GetMediaSampleDescription(coolMedia,trackIndex,imageDescH);
  299. return (*(ImageDescriptionHandle)imageDescH)->depth;
  300. }
  301. QuickTime 1.0 GetMoviePict grayscale images -157 error
  302. Written:    8/27/92
  303. Last reviewed:    10/11/92
  304. Trying to read any single frame (except the first) from a grayscale (4, 16, or 256 grays), QuickTime movie gives a -157 error (invalid pixel depth). I do “framehandle = GetMoviePict(damovie,daunitnum)” and test if it’s 0. If so, then I do “io = GetMoviesError()” and it gives me the -157 error. GetMoviePict is working fine for all color and black/white movies. It just doesn’t work on “Animation” grayscale and “Video” grayscale movies. Is this a bug?
  305. ___
  306. It is true that grayscale images will cause a -157 error with GetMoviePict using QuickTime 1.0. QuickTime 1.5 will fix this problem. Some grayscale images may work, if the color tables are custom made. To check for this situation, you can look at the clutID of the ImageDescription structure. If the clutId is 0, then there is a custom color table attached. For these images, GetMoviePict may work.
  307. Movies ‘LOOP’ Atom and Friends
  308. QuickTime    M.QT.MoviesLOOP
  309. Written by:    John Wang    November 1992
  310. This Technical Note discusses entertaining uses for QuickTime user data atoms, Apple defined and otherwise.
  311. Topics
  312. • User Data Types
  313. • Sample Code
  314. • Inside the User Data Atom
  315. Introduction
  316. It is often desirable for an application to preserve the window position and looping state of a movie.  This Technical Note describes the “Apple Sanctified” method of doing this using user data atoms.  
  317. User data atoms allow applications to store custom information which can be easily accessed using QuickTime Movie Toolbox calls.  These user data atoms are text or data which can be associated and stored in any movie, track, or media.  A reference to the list of user data atoms for each of these locations can be accessed with the following routines: GetMovieUserData(), GetTrackUserData(), and GetMediaUserData().  Once a reference to a list of user data atoms is obtained, an application can store, retrieve, and manage items in the list using the following routines:  GetNextUserDataType(), CountUserDataType(), AddUserData(), GetUserData(), RemoveUserData(), AddUserDataText(), GetUserDataText, and RemoveUserDataText().  A complete description of these routines can be found in Inside Macintosh: QuickTime in the “Working With Movie User Data” section of chapter 2.
  318. User Data Types
  319. Every user data atom carries a type identifier.  This identifier is stored in a long integer, similar to a Resource Manager type.  Apple has reserved all lowercase user data types values.  Applications are free to use types values containing at least one uppercase letter.
  320. In addition, since there is a differentiation between user data atoms which are handles to data and handles to text, Apple recommends that all text user data atoms begin with the © character (Option-G).
  321. The following user data types containing text data are currently defined:
  322.     '©cpy'        Copyright statement
  323.     '©day'        Date the movie content was created
  324.     '©dir'            Name of the movie's director
  325.     '©ed1' to '©ed9'    Edit dates and descriptions
  326.     '©fmt'        Indication of the movie format (computer-generated, digitized,                 and so on)
  327.     '©inf'            Information about the movie
  328.     '©nam'        Name of track or movie
  329.     '©prd'        Name of the writer movie's producer
  330.     '©prf'            Name of the performers
  331.     '©req'        Special hardware or software requirements
  332.     '©src'            Credits for those who provided the movie source content
  333.     '©wrt'        Name of the movie's
  334. Getting 'LOOP'-y
  335. MoviePlayer™ has also defined two movie data atoms which are used to indicate looping and window location which applications can implement for compatibility with MoviePlayer™.  They are:
  336.     'LOOP'    If this 4 byte user data atom exists in the movie's user data list, then looping is performed according to its value: 0 for normal looping and 1 for palindrome looping
  337.     'WLOC'    Handle to a point record indicating the last saved window position
  338. Another variation on this which originated before MoviePlayer™ that applications should be aware of, is the following:
  339.     'LOOP'    If this zero length data atom exists in the movie's user data list, then normal looping is performed.
  340. In summary, if a 'LOOP' atom exists, then looping should be performed.  If the returned data is a long integer of value 1, then palindrome looping should be performed.  Normal looping should be performed if data returned is of zero length or if the returned data is a long integer of value 0.
  341. Sample Code
  342. The following example demonstrates how to get looping information from a movie:
  343.     short        loopInfo;    //  0=no looping,1=normal looping,2=palindrome looping
  344.     Handle       theLoop;
  345.     Movie        theMovie;
  346.     UserData     theUserData;
  347.     loopInfo = 0;
  348.     theLoop = NewHandle(0);
  349.     theUserData = GetMovieUserData(theMovie);
  350.     if (CountUserDataType(theUserData, 'LOOP')) {
  351.         loopInfo = 1;
  352.         GetUserData(theUserData, theLoop, 'LOOP', 1);
  353.         if (GetHandleSize(theLoop))
  354.             if ((** (long **) theLoop) == 1)
  355.                 loopInfo = 2;
  356.     }
  357. The following example demonstrates how to add a looping atom to a movie to indicate that user has selected looping:
  358.     Handle       theLoop;
  359.     Movie        theMovie;
  360.     UserData     theUserData;
  361.     short        theCount;
  362.     theLoop = NewHandle(sizeof(long));
  363.     (** (long **) theLoop) = 0;
  364.     theUserData = GetMovieUserData(theMovie);
  365.     theCount = CountUserDataType(theUserData, 'LOOP');
  366.     while (theCount--)
  367.         RemoveUserData(theUserData, 'LOOP', 1);
  368.     AddUserData(theUserData, theLoop, 'LOOP');
  369. The following example demonstrates how to remove a looping atom from a movie to indicate that looping is not selected: 
  370.     Movie        theMovie;
  371.     UserData     theUserData;
  372.     short        theCount;
  373.     theUserData = GetMovieUserData(theMovie);
  374.     theCount = CountUserDataType(theUserData, 'LOOP');
  375.     while (theCount--)
  376.         RemoveUserData(theUserData, 'LOOP', 1);
  377.         
  378. Inside the User Data Atom
  379. Those of you who parse user data atoms directly by accessing the 'moov' handle rather than with the appropriate movie toolbox calls, will notice a trailing long integer of value 0 after all user data atoms in the list.  This is required for backward compatibility with QuickTime 1.0 which has a bug that requires the trailer.  The size of the 'udta' atom does reflect this extra trailing long integer.  QuickTime 1.0 and future versions will automatically handle this when manipulating user data atoms with the movie toolbox calls. 
  380. Further Reference:
  381. •    Inside Macintosh: QuickTime, Movie Toolbox Reference
  382. L◊#ˇ ˇˇˇˇ#◊†Ç 
  383. /ZÅ#
  384.     0Ià:µú9"{    ˇˇˇˇˇˇˇˇ#†ƒ°d
  385. ONLNf˛†å°d1drw2…-·_ġˇˇˇˇˇè°ñ x°ddrw2:°ddrw2:$°d4drw2:°öˇ˙ó@†ò,Times
  386. .R…R…+]BNew Technical Notes†ô°ddrw2:°„†ó°d1drw2eÙġˇˇˇˇˇP°ñ x°ddrw2:°ddrw2:$°d4drw2:°öˇ˚ÄE¿†ò
  387. ({ïDeveloper Support†ô°ddrw2:°„†ó°d`drw2-ÔˇˇˇˇˇˇKÔ- Z  ffZ°d1drw2 ¿˙ÈˇˇˇˇˇˇK°ñ x°ddrw2:°ddrw2:$°d4drw2:0°öˇÙĆò
  388. 0(UÔ†ô°ddrw2:°„†ó°d1drw2ÔÊ˙ˇˇˇˇˇˇ°ñ x°ddrw2:°ddrw2:$°d4drw2:    °öˇ˝Ä†ò
  389.     +&    ®†ô°ddrw2:°„†ó°d1drw2Â-¯yˇˇˇˇˇˇ°ñ x°ddrw2:°ddrw2:$°d4drw2:°öˇ˚Ä%†ò
  390. (Z\    Macintosh†ô°ddrw2:°„†ó†ç°ddrw2D†É
  391. IR.°dONLNdˇˇ(õZImage Compression Manager Q&As
  392. °dONLNdˇˇ*    QuickTime°dONLNdˇˇ(´nM.QT.ImageCompr.Q&As
  393. °dONLNdˇˇ(√Z Revised by:°dONLNdˇˇ)HDeveloper Support Center°dONLNdˇˇ(√‹ October 1992°dONLNdˇˇ(œZ Written by:°dONLNdˇˇ)HDeveloper Support Center°dONLNdˇˇ(œ‹ October 1990°dONLNdˇˇ(ÁZThis Technical Note contains a °dONLNdˇˇ)û9collection of Q&As relating to a specific topic—questions°dONLNdˇˇ(ÛZGyou’ve sent the Developer Support Center (DSC) along with answers from °dONLNdˇˇ(Ûæthe DSC engineers.°dONLNdˇˇ(ˇZ
  394. While DSC °dONLNdˇˇ)9Lengineers have checked the Q&A content for accuracy, the Q&A Technical Notes°dONLNdˇˇ( Z don’t have °dONLNdˇˇ)5Qthe editing and organization of other Technical Notes. The Q&A function is to get°dONLNdˇˇ(Znew technical information and °dONLNdˇˇ)ù6updates to you quickly, saving the polish for when the°dONLNdˇˇ(#Z,information migrates into reference manuals.°dONLNdˇˇ*:Q&As are now included with Technical Notes to make access °dONLNdˇˇ(;âto technical updates easier for°dONLNdˇˇ(GZ/you. If you have comments or suggestions about °dONLNdˇˇ)Ú*Q&A content or distribution, please let us°dONLNdˇˇ(SZknow °dONLNdˇˇ) Iby sending an AppleLink to DEVFEEDBACK. Apple Partners may send technical°dONLNdˇˇ(_Z9questions about Q&A content to DEVSUPPORT for resolution.°dONLNdˇˇ*NNew Q&As and Q&As revised this month are marked with a bar in the side margin."n  ÜXÜ
  395. °dONLNdˇˇ*4;QuickTime fills in image descriptor when data is compressed
  396. °dONLNdˇˇ* Written:°dONLNdˇˇ* Last reviewed:°dONLNdˇˇ*When I send compressed °dONLNdˇˇ)~?images over Ethernet, CompressSequenceBegin doesn’t fill in the°dONLNdˇˇ(ÁZ"ImageDescription, which is needed °dONLNdˇˇ)≈*at the other end of the conference link to°dONLNdˇˇ(ÛZ'DecompressSequenceBegin. Is this a bug?°dONLNdˇˇ* ___°dONLNdˇˇ*HCompressSequenceBegin doesn’t actually modify the handle that you pass. °dONLNdˇˇ(ˆInstead,°dONLNdˇˇ(#Z
  397. QuickTime °dONLNdˇˇ)7Qmakes a note of the handle that’s passed and doesn’t actually modify the contents°dONLNdˇˇ(/Z<until the first call that actually compresses data, such as °dONLNdˇˇ(/uCompressSequenceFrame. At that°dONLNdˇˇ(;Z"point, the handle will be changed.°dONLNdˇˇ*If you °dONLNdˇˇ) Ycan postpone dealing with the image descriptor until after the first call that compresses°dONLNdˇˇ(_Z5data, whatever you are writing should work just fine. ◊X◊
  398. *çImage Compression Manager Q&As(Ï1) of 2ˇ°¿Ù%%DSIDICT:_cv
  399. currentdict /bu known {bu}if
  400. userdict /_cv known not{userdict /_cv 30 dict put}if
  401. _cv begin
  402. /bdf{bind def}bind def
  403. currentscreen/cs exch def/ca exch def/cf exch def
  404. /setcmykcolor where{/setcmykcolor get /cvcmyk exch def}{/cvcmyk{1 sub 4 1 roll 3{3 index add neg dup 0 lt{pop 0}if 3 1 roll}repeat setrgbcolor pop}bdf }ifelse
  405. /ss{//cf //ca //cs setscreen}bdf
  406. /stg{ss setgray}bdf
  407. /strgb{ss setrgbcolor}bdf
  408. /stcmyk{ss cvcmyk}bdf
  409. /min1{dup 0 eq{pop 1}if}bdf
  410. end
  411. currentdict /bn known {bn}if
  412. †ø∞◊#ˇ ˇˇˇˇ#◊ 
  413. IR,Times
  414. .+6-Macintosh Technical Notes /4/˘
  415. °dONLNdˇˇ*'1Decompressing to partial window: Bug & workaround"H3
  416. °dONLNdˇˇ* Written:°dONLNdˇˇ)L6/18/92"W3 °dONLNdˇˇ(l6Last reviewed:°dONLNdˇˇ)L9/15/92"c3 "o3 °dONLNdˇˇ(Ñ63Under System 7, decompressing directly to a window °dONLNdˇˇ(Ñ8,that is partially “off the screen” (that is,"{3 °dONLNdˇˇ(ê6Ynot completely visible) results in a -50 (invalid param) QuickTime error. We can special °dONLNdˇˇ(ê‰case"á3 °dONLNdˇˇ(ú6 when windows are off the screen °dONLNdˇˇ)¶4and decompress into an offscreen GWorld but we would"ì3 °dONLNdˇˇ(®6-prefer a fix to either QuickTime or System 7."ü3 °dONLNdˇˇ* ___"´3 "∑3 °dONLNdˇˇ*YThe problem you are having is due to a bug in the Image Compression Manager. It fails to °dONLNdˇˇ(Âclear"√3 °dONLNdˇˇ(ÿ6NQDError when starting a decompression job and later checks it to see if it is °dONLNdˇˇ(ÿúOK to continue the"œ3 °dONLNdˇˇ(‰6?operation. Something else is setting QDErr and your call fails."€3 "Á3 °dONLNdˇˇ*The solution that you can °dONLNdˇˇ)zBimplement now consists of clearing QDErr before calling any of the"Û3 °dONLNdˇˇ(6Jdecompression routines. You can accomplish this by calling QDError (which °dONLNdˇˇ(Æclears the error"ˇ3 °dONLNdˇˇ(6Wafter it passes the current value to you) or zeroing the low mem QDerr (0xD6E) by hand." 3 "3 °dONLNdˇˇ*Future versions of QuickTime °dONLNdˇˇ)ë?will have the fix and will not require that you work around the"#3 °dONLNdˇˇ(86problem."/3  ◊4◊˘
  417. (Ï62) of 2(ÏfImage Compression Manager Q&Asˇ¨◊#ˇ ˇˇˇˇ#◊†Ç 
  418. /ZÅ#
  419.     0Ià:µú9"{    ˇˇˇˇˇˇˇˇ#†ƒ°d
  420. ONLNf˛†å°d1drw2…-·_ġˇˇˇˇˇè°ñ x°ddrw2:°ddrw2:$°d4drw2:°öˇ˙ó@†ò,Times
  421. .R…R…+]BNew Technical Notes†ô°ddrw2:°„†ó°d1drw2eÙġˇˇˇˇˇP°ñ x°ddrw2:°ddrw2:$°d4drw2:°öˇ˚ÄE¿†ò
  422. ({ïDeveloper Support†ô°ddrw2:°„†ó°d`drw2-ÔˇˇˇˇˇˇKÔ- Z  ffZ°d1drw2 ¿˙ÈˇˇˇˇˇˇK°ñ x°ddrw2:°ddrw2:$°d4drw2:0°öˇÙĆò
  423. 0(UÔ†ô°ddrw2:°„†ó°d1drw2ÔÊ˙ˇˇˇˇˇˇ°ñ x°ddrw2:°ddrw2:$°d4drw2:    °öˇ˝Ä†ò
  424.     +&    ®†ô°ddrw2:°„†ó°d1drw2Â-¯yˇˇˇˇˇˇ°ñ x°ddrw2:°ddrw2:$°d4drw2:°öˇ˚Ä%†ò
  425. (Z\    Macintosh†ô°ddrw2:°„†ó†ç°ddrw2D†É
  426. IR.°dONLNdn<ÅÛ(õZMovie Toolbox Q&As
  427. °dONLNdÄ<èÖ*    QuickTime°dONLNdÄhè˛(´ÜM.QT.MovieTB.Q&As
  428. °dONLNd/õ<ßt(√Z Revised by:°dONLNd;õÑߡ)HDeveloper Support Center°dONLNdTõ¥ß˛(√“
  429. December 1992°dONLNdbß<≥q(œZ Written by:°dONLNdnßÑ≥ˇ)HDeveloper Support Center°dONLNdáßæ≥˛(œ‹ October 1990°dONLNdîø<À⁄(ÁZThis Technical Note contains a °dONLNd≥ø⁄À˛)û9collection of Q&As relating to a specific topic—questions°dONLNdÌÀ<◊†(ÛZGyou’ve sent the Developer Support Center (DSC) along with answers from °dONLNd4À†◊˛(Ûæthe DSC engineers.°dONLNdG◊<„u(ˇZ
  430. While DSC °dONLNdQ◊u„˛)9Lengineers have checked the Q&A content for accuracy, the Q&A Technical Notes°dONLNdû„<Ôq( Z don’t have °dONLNd©„qÔ˛)5Qthe editing and organization of other Technical Notes. The Q&A function is to get°dONLNd˚Ô<˚Ÿ(Znew technical information and °dONLNdÔŸ˚˛)ù6updates to you quickly, saving the polish for when the°dONLNdP˚<(#Z,information migrates into reference manuals.°dONLNd}<k*:Q&As are now included with Technical Notes to make access °dONLNd∑k˛(;âto technical updates easier for°dONLNd◊<+.(GZ/you. If you have comments or suggestions about °dONLNd.+˛)Ú*Q&A content or distribution, please let us°dONLNd1+<7\(SZknow °dONLNd6+\7˛) Iby sending an AppleLink to DEVFEEDBACK. Apple Partners may send technical°dONLNdÄ7<Ci(_Z9questions about Q&A content to DEVSUPPORT for resolution.°dONLNd∫O<[¨*New Q&As this month:°dONLNdœ[<gI* ,How to get more recent MovieRecorder version°dONLNd¸g<sM* -Getting movie from movie controller component°dONLNd*s<O* -Determining QuickDraw video media pixel depth ™X™
  431. °dONLNdX§<≥z*4,How to get more recent MovieRecorder version
  432. °dONLNdÖ≥<øx*
  433. Date written:°dONLNdì≥àø¨)L9/21/92°dONLNdõø<ÀÅ(ÁZLast reviewed:°dONLNd™øàÀ¨)L11/1/92°dONLNd≤◊<„H(ˇZI °dONLNd¥◊H„˛) Npurchased the QuickTime Developer’s Kit, which contains the Starter’s Kit with°dONLNd„<ÔQ( Z9MovieRecorder version 1.0a1. This seems to have a lot of °dONLNd<„QÔ˛( o#bugs. How can I get a later version°dONLNd`Ô<˚.(Z/of MovieRecorder that works with QuickTime 1.0?°dONLNdê˚<N* ___°dONLNdî<ä*EThe only way to obtain the current version of MovieRecorder (version °dONLNdŸä˛(;®1.0 final) is to purchase°dONLNdÛ<+ª(GZLthe QuickTime Starter Kit. Because the Starter Kit is focused on end users, °dONLNd?ª+˛(GŸit is available°dONLNdO+<7z(SZCthrough your local Apple reseller. It’s not available through APDA. ◊X◊
  434. *ôMovie Toolbox Q&As(Ïˇ1) of 13ˇ°¿Ù%%DSIDICT:_cv
  435. currentdict /bu known {bu}if
  436. userdict /_cv known not{userdict /_cv 30 dict put}if
  437. _cv begin
  438. /bdf{bind def}bind def
  439. currentscreen/cs exch def/ca exch def/cf exch def
  440. /setcmykcolor where{/setcmykcolor get /cvcmyk exch def}{/cvcmyk{1 sub 4 1 roll 3{3 index add neg dup 0 lt{pop 0}if 3 1 roll}repeat setrgbcolor pop}bdf }ifelse
  441. /ss{//cf //ca //cs setscreen}bdf
  442. /stg{ss setgray}bdf
  443. /strgb{ss setrgbcolor}bdf
  444. /stcmyk{ss cvcmyk}bdf
  445. /min1{dup 0 eq{pop 1}if}bdf
  446. end
  447. currentdict /bn known {bn}if
  448. †øB◊#ˇ ˇˇˇˇ#◊ 
  449. IR,Times
  450. .+6-Macintosh Technical Notes /4/˘
  451. °dONLNd)8]*'-Getting movie from movie controller component
  452. °dONLNd.8DT*
  453. Date written:°dONLNd<8dDà)L7/22/92°dONLNdDDP](l6Last reviewed:°dONLNdSDdPà)L11/1/92°dONLNd[\h>(Ñ6@Is there a way that the action filter proc of a QuickTime movie °dONLNdõ\>h⁄(Ñ\controller component can have a°dONLNdªht](ê6user reference °dONLNd h]t⁄)EOfield so that I can know which movie-“object” the movie controller is referring°dONLNdtÄ@(ú6Ato? There are local variables associated with a particular movie °dONLNd[t@Ä⁄(ú^ that I would like to access from°dONLNd|ÄåE(®6Cthe action filter proc; currently there’s no way to reference back °dONLNdøÄEå⁄(®cto the variables in my program°dONLNdfiåòá(¥6except through globals.°dONLNdˆò§** ___°dONLNd˙∞º*3The movie controller action filter does not have a °dONLNd-∞º⁄)È+reference field. As a workaround, you might°dONLNdYº»)(‰68store your movie data in the userData area of the movie °dONLNdëº)»⁄(‰G and then call MCGetMovie from an°dONLNd≤»‘7(6action °dONLNdπ»7‘⁄)Xfilter. Once you get a reference to the movie, you can then retrieve the user data. Here°dONLNd‘‡ê(¸6are code snippets to do it:,
  454. Courier
  455.     °dONLNd.Ϙ|*  Handle movieNameH;°dONLNdCˆ|*
  456.   Str255  movieName;°dONLNdX |*
  457.   Movie   coolMovie;°dONLNdmr*  // Get coolMovie°dONLNdÄ)Â*
  458. )  movieNameH = NewHandle(sizeof(Str255));°dONLNd™(3Â*
  459. )  strcpy(*movieNameH,PtoCstr(movieName));°dONLNd‘2=P*
  460. >  AddUserData(GetMovieUserData(coolMovie),movieNameH ,'©nam');°dONLNdFQ®*Ppascal Boolean myMCActionFilter( MovieController mc, short *action,long *params)°dONLNddP[*
  461. {°dONLNdfZe|*
  462. Handle    movieName;°dONLNd{do|*
  463. Movie     coolMovie;°dONLNdênyT*
  464. UserData  u;°dONLNdùÇç÷*&movieName = NewHandle(sizeof(Handle));°dONLNdƒåóü*
  465. coolMovie = MCGetMovie(mc);°dONLNd‡ñ°∏*
  466.  u = GetMovieUserData(coolMovie);°dONLNd†´ƒ*
  467. "GetUserData(u,movieName,'©nam',1);°dONLNd$™µ!*
  468. 5return false;  // let mc component handle all actions°dONLNdZ¥ø*
  469. }
  470. °dONLNd\÷Â_*&-Determining QuickDraw video media pixel depth
  471. °dONLNdäÂÒT*
  472. Date written:°dONLNdòÂdÒà)L8/18/92°dONLNd†Ò˝](6Last reviewed:°dONLNdØÒd˝à)L11/1/92°dONLNd∑    |(16JHow do I get the pixel depth of a QuickTime video media for a given track?°dONLNd!** ___°dONLNd-9›*)The following sample code does the trick:
  473.     °dONLNd0EPÜ*#include <QuickDraw.h>°dONLNdGOZw*
  474. #include <Movies.h>°dONLNd[Yd©*
  475. #include <ImageCompression.h>°dONLNdymx:*:Media GetFirstVideoMedia(Movie coolMovie,long *trackIndex)°dONLNd¥wÇ*
  476. {°dONLNd∂Ååã*
  477.   Track  coolTrack=nil;°dONLNdŒãñã*
  478.   Media  coolMedia=nil;°dONLNdÊï†r*
  479.   long  numTracks;°dONLNd˘ü™|*
  480.   OSType  mediaType; ◊4◊˘
  481. *&2) of 13(ÏúMovie Toolbox Q&Asˇn◊#ˇ ˇˇˇˇ#◊ 
  482. IR,Times
  483. .+Z-Developer Support Center(-fi
  484. December 1992 /X/,
  485. Courier
  486.     °dONLNd'<2(NZ,  numTracks = GetMovieTrackCount(coolMovie);°dONLNd-1<<Ü*
  487. B  for (*trackIndex=1; *trackIndex <= numTracks; (*trackIndex)++) {°dONLNdp;<FT*
  488. 8    coolTrack = GetMovieIndTrack(coolMovie,*trackIndex);°dONLNd©E<PT*
  489. 8    if (coolTrack) coolMedia = GetTrackMedia(coolTrack);°dONLNd‚O<Z∏*
  490. L    if (coolMedia) GetMediaHandlerDescription(coolMedia,&mediaType,nil,nil);°dONLNd/Y<dJ*
  491. 6    if (mediaType == VideoMediaType) return coolMedia;°dONLNdfc<nK*
  492.   }°dONLNdjm<x*
  493. *  *trackIndex=0;  // trackIndex can’t be 0°dONLNdïw<ÇT*
  494. 8  return nil;    // went through all tracks and no video°dONLNdŒÅ<åA*
  495. }°dONLNd–ï<†;*3short GetFirstVideoTrackPixelDepth(Movie coolMovie)°dONLNdü<™A*
  496. {°dONLNd©<¥Ø*
  497. SampleDescriptionHandle°dONLNd≥<ær*
  498. >imageDescH=(SampleDescriptionHandle)NewHandle(sizeof(Handle));°dONLNd]Ω<»»*
  499. long           trackIndex=0;°dONLNdz«<“Õ*
  500. Media          coolMedia=nil;°dONLNdò€<ÊJ*6coolMedia = GetFirstVideoMedia(coolMovie,&trackIndex);°dONLNdœÂ<^*
  501. :if (!trackIndex || !coolMedia) return -1;  // we need both°dONLNd
  502. Ô<˙c*
  503. ;GetMediaSampleDescription(coolMedia,trackIndex,imageDescH);°dONLNdF<@*4return (*(ImageDescriptionHandle)imageDescH)->depth;°dONLNd{
  504. <A*
  505. }
  506. °dONLNd}/<>fl*&;QuickTime Movie Toolbox “globals” are stored in system heap
  507. °dONLNdπ><Jb* Written:°dONLNd√J<VÅ* Last reviewed:°dONLNd”b<nƒ*According to the QuickTime °dONLNdÓbƒn˛)à;Movie Toolbox documentation, “The Movie Toolbox maintains a°dONLNd*n<zY(ñZset of °dONLNd1nYz˛)Uglobal variables for every application using it.” How much global memory is required?°dONLNdáz<Ü    (¢Z,Our application is shy on global data space.°dONLNd¥Ü<íN* ___°dONLNd∏û<™.*0The information maintained is not kept with the °dONLNdËû.™˛)Ú*application’s global variables. The handle°dONLNd™<∂Ä(“Zcreated by the °dONLNd"™Ä∂˛)DOEnterMovies call is stored in the system heap, not in the application heap. You°dONLNdr∂<¬o(fiZ=don’t have to worry about how much space to allocate in your °dONLNdØ∂o¬˛(fiç application. This initialization°dONLNd–¬<ŒÎ(ÍZ%does not affect your A5 world either.°dONLNdˆ⁄<ÊT*=EnterMovies initializes everything, including setting up the °dONLNd3⁄TÊ˛(r#necessary data space and creating a°dONLNdWÊ<Ú (ZUhandle to it. When you’re done, be sure to make a call to ExitMovies to clean up the °dONLNd¨Ê Ú˛(Ë    QuickTime°dONLNd∂Ú<˛S(Zdata.°dONLNdº
  508. <o*CIf an application makes multiple calls to EnterMovies, a different °dONLNdˇ
  509. o˛(2çset of “globals,” or data area,°dONLNd<"W(>Zis set °dONLNd&W"˛)Wup for each call. A call to ExitMovies should be made before exiting the area that made°dONLNd~"<.ò(JZIthe call to EnterMovies. For example, an application that uses QuickTime °dONLNd«"ò.˛(J∂will call EnterMovies°dONLNd›.<:V(VZ5and set up the QuickTime world. Then an external may °dONLNd.V:˛(Vt be called upon that wants to use°dONLNd3:<F.(bZ,QuickTime. This external would have to make °dONLNd_:.F˛)Ú'a call to EnterMovies to set up another°dONLNdáF<R’(nZTQuickTime world for its use. Before leaving, the external should call ExitMovies to °dONLNd€F’R˛(nÛclean up°dONLNd‰R<^≈(zZSafter itself. The application can then continue to use QuickTime with the original °dONLNd    7R≈^˛(z„ world it set°dONLNd    D^<jL(ÜZup.
  510. °dONLNd    HÇ<ë    *'QuickTime file audio retrieval
  511. °dONLNd    gë<ùb* Written:°dONLNd    qù<©Å* Last reviewed: ◊X◊
  512. *'Movie Toolbox Q&As(Ïˇ3) of 13ˇí◊#ˇ ˇˇˇˇ#◊ 
  513. IR,Times
  514. .+6-Macintosh Technical Notes /4/˘
  515. °dONLNd)5*$1How can I retrieve audio from QuickTime files in °dONLNd1)5⁄)Ï*1-second chunks? I need a sound equivalent°dONLNd\5Aj(]6of GetMoviePict.°dONLNdmAM** ___°dONLNdqYeq*You will have to °dONLNdÇYqe⁄)YCwrite your own audio extraction routine. The Movie Toolbox does not°dONLNdΔeqØ(ç6provide a simple call to, say, °dONLNdÂeØq⁄)ó8GetMovieSound(movie, time, duration). To get around this°dONLNdq}{(ô6Glimitation, use GetMediaSample and collect the sound data by hand. The °dONLNdeq{}⁄(ôôformat for the final°dONLNdz}âí(•6Vresult is up to you; in the case of a 'snd ' resource you’d create the handle fill in °dONLNd–}íâ⁄(•∞the other fields°dONLNd·âïü(±6and put the sample data in it.°dONLNd°≠T*AYou can use the QuickTime SoundDescription data structure (1) to °dONLNdA°T≠⁄(…rfind frequency, format, and°dONLNd]≠πå(’6other details, (2) to help °dONLNdx≠åπ⁄)tAyou figure out how many samples you need for a second, and (3) to°dONLNd∫π≈§(·6!fill in the resource data fields.°dONLNd‹—›O*>Of course, this scheme gets more complicated in the case when °dONLNd—O›⁄(˘mthere are more than a single°dONLNd7›È:(6sound °dONLNd=›:È⁄)"Ntrack. The best source of information on sound resources and such is the Sound°dONLNdåÈıu(6Manager chapter in °dONLNdüÈuıΔ)]Inside Macintosh°dONLNdØÈΔı)Q  Volume VI.
  516. °dONLNdª
  517. ï(865Current QuickTime supports only video and sound media
  518. °dONLNdÒ(>* Written:°dONLNd˚(4]* Last reviewed:°dONLNd @L*/Can I add a media to a QuickTime movie that is °dONLNd:@L⁄)Ì+not video or audio? If so is there anything°dONLNdfLXè(t6Qspecial I need to do to add text notes that can potentially accompany each frame °dONLNd∑LèX⁄(t≠in my “movie,”°dONLNdΔXdi(Ä6Gwhich can follow the video frames if a user edits the movie in any way.°dONLNddp** ___°dONLNd|à∏*!The current release of QuickTime °dONLNd3|∏à⁄)†9only allows for video and sound media. There is no way to°dONLNdmàî-(∞69install your own type. This is a high QuickTime priority °dONLNd¶à-î⁄(∞K$and is likely to make it in a future°dONLNdÀî†#(º6;release, but at the present there is no mechanism to do it.
  519. °dONLNd∏«Ù*'!Status of rotating matrix support
  520. °dONLNd)«”>* Written:°dONLNd3”fl]* Last reviewed:°dONLNdCΘπ*VWhat is the status of RotateMatrix and its use with SetMovieMatrix and SetTrackMatrix?°dONLNdö˜** ___°dONLNdûV*ARotateMatrix works fine. But rotating matrixes are not supported °dONLNdflV⁄(7tfor movies or images. So,°dONLNd˘'≠(C6Talthough RotateMatrix will give you the correct mathematical result, unless you are °dONLNdM≠'⁄(CÀ    using the°dONLNdW'3°(O6Tmatrix to transform something else (as with TransformFixedPoints) it has little use.°dONLNd¨?K¶*YRotation is a very important future direction that will get more attention in the future.
  521. °dONLNdcr*' How to get the first video frame
  522. °dONLNd'r~>* Written:°dONLNd1~ä]* Last reviewed: ◊4◊˘
  523. *F4) of 13(ÏúMovie Toolbox Q&Asˇ&◊#ˇ ˇˇˇˇ#◊ 
  524. IR,Times
  525. .+Z-Developer Support Center(-fi
  526. December 1992 /X/
  527. °dONLNd<)∞(EZGStepping through QuickTime movie video frames in the order they appear °dONLNdG∞)˛(EŒin the movie is°dONLNdW)<5g(QZ=simple using GetMovieNextInterestingTime, except for getting °dONLNdî)g5˛(QÖ"the first frame. If I set the time°dONLNd∑5<A&(]Z4to zero and rate to 1, then I get the second frame, °dONLNdÎ5&A˛)Í/not the first. In addition, the video may start°dONLNdA<MÅ(iZFlater than at 0. How do you suggest finding this first frame of video?°dONLNdbM<YN* ___°dONLNdfe<q}* To get the °dONLNdqe}q˛)ADfirst frame in the conditions you describe you have to pass the flag°dONLNd∂q<}‹(ôZRnextTimeEdgeOK = $2000 to GetMovieInterestingTime. What this flag does is to make °dONLNdq‹}˛(ô˙the call°dONLNd}<â€(•Z$return the current interesting time °dONLNd5}€â˛)ü@instead of the next, if the current time is an interesting time.°dONLNdvâ<ïx(±Z You need to °dONLNdÇâxï˛)<Rdo this since there is no way to go negative and then ask for the next interesting°dONLNd’ï<°T(ΩZtime.
  528. °dONLNd€π<»?*'%QuickTime interfaces for Think Pascal
  529. °dONLNd»<‘b* Written:°dONLNd ‘<‡Å* Last reviewed:°dONLNdÏ<¯∑*IHas Apple created QuickTime headers/interfaces for Think Pascal? The MPW °dONLNddÏ∑¯˛(’Pascal headers°dONLNds¯<ƒ( Zdon’t seem to be compatible.°dONLNdê<N* ___°dONLNdî<(C*6There are no Think Pascal interfaces, but your Pascal °dONLNd C(˛(Da#Package comes with a program called°dONLNdÓ(<4q(PZ;Pascal Source Converter, which converts MPW Pascal sources °dONLNd)(q4˛(Pèto Think. This should be all°dONLNdF4<@Ë(\ZZyou need to be able to use the provided interfaces with your favorite development package.
  530. °dONLNd°X<gg*')Standard controller with MCCut or MCClear
  531. °dONLNdÀg<sb* Written:°dONLNd’s<Å* Last reviewed:°dONLNdÂã<óÌ*[When I select all frames, then do an MCCut or MCClear, the standard controller gets larger °dONLNd@ãÌó˛(≥ and°dONLNdDó<£z(øZEredraws itself at the top of the movie. Is this a situation I should °dONLNdâóz£˛(øòbe prepared to handle or a°dONLNd§£<Ø∂(ÀZObug? Does the controller behave strangely when the selectionTime of a movie is °dONLNdÛ£∂Ø˛(À‘-1 or when the°dONLNdØ<ª∫(◊Zduration of the movie is 0?°dONLNdª<«N* ___°dONLNd"”<flí*The behavior you °dONLNd3”ífl˛)VNare observing is to be expected if the controller is attached to the movie. In°dONLNdÇfl<Ή(Z]this case, the controller goes to wherever the bottom-left corner of the movie box takes it. °dONLNdflfl‰Î˛(If the°dONLNdÊÎ<˜Û(Z`movie loses all of its “visible” parts, the movie controller will jump to the top of the window.°dONLNdG<±*OThe only way to get around this is to detach the controller when the movie box °dONLNdñ±˛(+œis empty; this is°dONLNd®<“(7Zalso something to keep in mind °dONLNd«“˛)ñ<for the cases when the movie contains only sound, since pure°dONLNd<'„(CZ sound movies have no dimensions.
  532. °dONLNd%?<NX*'(QuickTime and sound channel deallocation
  533. °dONLNdNN<Zb* Written:°dONLNdXZ<fÅ* Last reviewed:°dONLNdhr<~F*/Our QuickTime application gets a Sound Manager °dONLNdórF~˛(öd"error -201 after playing movies in°dONLNd∫~<äË(¶ZSsuccession, apparently because sound channels used in the previous movies have not °dONLNd    
  534. ~Ëä˛(¶been°dONLNd    ä<ñ„(≤Zreclaimed. How does QuickTime °dONLNd    0ä„ñ˛)ß7decide to deallocate sound channels? It doesn’t seem to°dONLNd    hñ<¢ô(æZDhappen in my “while (!IsMovieDone(theMovie) && !Button()” play loop. ◊X◊
  535. *.Movie Toolbox Q&As(Ïˇ5) of 13ˇÏ◊#ˇ ˇˇˇˇ#◊ 
  536. IR,Times
  537. .+6-Macintosh Technical Notes /4/˘
  538. °dONLNd)**___°dONLNd5Aù*NSound channels are released by active movies when they notice that some other °dONLNdR5ùA⁄(]ª movie needs°dONLNd^AMä(i6them. This is currently °dONLNdvAäM⁄)rAonly done at MoviesTask time. Before entering your loop to play a°dONLNd∏MY(u66single movie, you can do one or both of the following:°dONLNdÔeq¬*%• Preroll the movie you are about to °dONLNde¬q⁄)™;play and check the error. If preroll returns -201 then do a°dONLNdPq}m(ô6MoviesTask(0,0) °dONLNd`qm}⁄)UKto give the other active movies a chance to give up their sound channels. A°dONLNd¨}â(•63subsequent preroll of theMovie should return noErr.°dONLNd‡âï?* <• SetMovieActive(othermovies, false). Deactivate the movies °dONLNdâ?ï⁄(±] that you aren’t playing to force°dONLNd=ï°≠(Ω6 them to give up their resources.
  539. °dONLNd^π»*' Clipping QuickTime movie posters
  540. °dONLNd»‘>* Written:°dONLNd⑇]* Last reviewed:°dONLNdôϯΔ*`Our application uses the movie poster as a still frame in a cell, similar to using a PICT. If a °dONLNd˘ÏΔ¯⁄(‰user°dONLNd˛¯´( 6Wsizes the cell width so it’s narrower than the poster, even though we clip the drawing °dONLNdU¯´⁄( … to the cell°dONLNdav(,6Hsize, QuickTime posters draw their full width, writing over whatever is °dONLNd©v⁄(,îin the way. Pictures°dONLNdæú(86Nclip through DrawPicture; why doesn’t ShowMoviePoster stay within clip region?°dONLNd
  541. (** ___°dONLNd4@¥*PShowMoviePoster, as well as the movie and preview showing calls, uses the movie °dONLNda4¥@⁄(\“clipping°dONLNdj@Lí(h6characteristics rather than °dONLNdÜ@íL⁄)zEthe destination port cliprgn. You must set the movie’s clip to obtain°dONLNdÃLX^(t6Ethe results you want. An easier way to do this is to get the picture °dONLNdL^X⁄(t|for the poster, by calling°dONLNd,Xd0(Ä67GetMoviePosterPict, and then simply use DrawPicture to °dONLNdcX0d⁄(ÄN#display the poster. Because this is°dONLNdádp≤(å6Zjust a picture, the clip region of the port is honored. This way you don’t need different °dONLNd·d≤p⁄(å–code for°dONLNdÍp|z(ò6movies and pictures.
  542. °dONLNdˇî£*'!PutMovieIntoHandle and data forks
  543. °dONLNd!£Ø>* Written:°dONLNd+ت]* Last reviewed:°dONLNd;«”y*GI save PICTs to my document’s data fork by writing the contents of the °dONLNdÇ«y”⁄(ÔóPicHandle. To save°dONLNdï”fl(˚65movies, do I convert the movie to a handle, and then °dONLNd ”fl⁄)˚)save that like I would with PICTs? I just°dONLNdÙfl·(6.want the file references, not the data itself.°dONLNd#Θ** ___°dONLNd'±*TTo save movies that are suitable for storage in a file, use PutMovieIntoHandle. The °dONLNd{±⁄(+œ    result of°dONLNdÖñ(76Ethis call can then be saved in the data fork of your files, and then °dONLNd ñ⁄(7¥ you can call°dONLNd◊'o(C6DNewMovieFromHandle to reconstruct the movie for playback or editing.°dONLNd3?ô*MYou should also read the documentation regarding Movie Toolbox FlattenMovie, °dONLNdi3ô?⁄([∑
  544. which creates°dONLNdw?K“(g6)a file that contains the 'moov' resource °dONLNd†?“K⁄)∫8and the data all in the data fork. The advantage here is°dONLNdŸKWÑ(s6that the movie file you °dONLNdÒKÑW⁄)lDcreate using FlattenMovie can be read by any other QuickTime-capable°dONLNd    6WcO(6 application.
  545. °dONLNd    C{äh*'0SetMovieRate and controlling movie playback rate
  546. °dONLNd    täñ>* Written:°dONLNd    ~ñ¢]* Last reviewed: ◊4◊˘
  547. *.6) of 13(ÏúMovie Toolbox Q&Asˇ|◊#ˇ ˇˇˇˇ#◊ 
  548. IR,Times
  549. .+Z-Developer Support Center(-fi
  550. December 1992 /X/
  551. °dONLNd)<5k(QZ>QuickTime is a joy! But I’ve run aground with SetMovieRate. I °dONLNd>)k5˛(Qâam trying to change the rate at°dONLNd^5<A8(]Z5which a movie plays back, but if I call SetMovieRate °dONLNdì58A˛)¸)the movie starts playing immediately, the°dONLNdΩA<M–(iZZcontroller goes wild and the next time I hit the play button it ignores the previous rate.°dONLNdM<YN* ___°dONLNde<qû*SetMovieRate takes °dONLNd/eûq˛)bFeffect immediately; that’s why the movie starts playing as soon as you°dONLNdvq<}µ(ôZNmake the call, with a rate other than zero. Also, calling SetMovieRate behind °dONLNdƒqµ}˛(ô”the controller’s°dONLNd’}<â (•Z*back can only cause confusion because you °dONLNdˇ} â˛)–3are changing the state of the movie without letting°dONLNd3â<ïû(±ZJthe movie controller know about the change. Note that in normal operation °dONLNd}âûï˛(±ºthe movie controller°dONLNdíï<°¬(ΩZWplays back movies at the standard speed, rate = 1; this is the current behavior. It is °dONLNdÈאּ˛(Ω‡
  552. possible that°dONLNd˜°<≠ (…ZWin a future release the movie controller will use the rate the movie was saved with or °dONLNdN° ≠˛(…Ë the one set°dONLNdZ≠<πΔ(’Zwith SetPreferredMovieRate.°dONLNdw≈<—™*A little-known fact is °dONLNdé≈™—˛)nCthat the standard controller does contain a primitive mechanism for°dONLNd“—<›L(˘Z:controlling the rate of playback. If you hold the control °dONLNd —L›˛(˘j!key down and then click the mouse°dONLNd.›<È≥(ZKover the stepping buttons, you can, for example, play the movie backwards. °dONLNdy›≥È˛(—Furthermore, if°dONLNdâÈ<ı÷(ZXyou hold the mouse down you’ll get a slider control that does let you play the movie at °dONLNd·È÷ı˛(Ù    different°dONLNdÎı<Ω(Zrates backward or forward.°dONLNd
  553. <–*ZThe slider provided by the standard controller is not intended to set the rate, so if you °dONLNd`
  554. –˛(5Ó    play once°dONLNdj<%ò(AZKat low speed the rate does not stick and, as you have found, the next time °dONLNdµò%˛(A∂you click on the play°dONLNdÀ%<1è(MZIbutton you go back to the normal speed. If you need the selected rate to °dONLNd%è1˛(M≠remain for the session,°dONLNd,1<=8(YZ4you’ll have to provide your own method of selection.°dONLNdaI<UÌ*SOnce you know your desired speed, you’ll need to provide your own filter procedure °dONLNd¥IÌU˛(q and°dONLNd∏U<a‘(}ZWinstall it calling MCSetActionFilter. Upon receiving any mcActionPlay actions for rate °dONLNdU‘a˛(}Úchanges,°dONLNda<mñ(âZKyou’ll need to call SetMovieRate to set the movie in motion at the desired °dONLNdcañm˛(â¥rate (and return true).°dONLNd{m<y}(ïZUsing a filter °dONLNdäm}y˛)APproc is the legal way of doing this because the controller can keep in sync with°dONLNd€y<Öº(°ZXthe actions regardless of the fact that it’s your code that actually affects the action.°dONLNd4ë<ù÷*RNote that you will have to do some extra work to mimic the normal behavior of the °dONLNdÜë÷ù˛(πÙstandard°dONLNdèù<©s(≈ZAcontroller. For example, when you’re at the end of the movie and °dONLNd–ùs©˛(≈ëthe user hits the play button,°dONLNdÔ©<µ`(—Z>the controller goes back to the beginning and plays the movie. ◊X◊
  555. (ÏZMovie Toolbox Q&As(Ïˇ7) of 13ˇ∏◊#ˇ ˇˇˇˇ#◊ 
  556. IR,Times
  557. .+6-Macintosh Technical Notes /4/˘
  558. °dONLNd)81*'&QuickTime track and movie sound volume
  559. °dONLNd'8D>* Written:°dONLNd1DP]* Last reviewed:°dONLNdA\h≥* What do the values of a movie’s °dONLNda\≥h⁄)õ<or track’s volume represent? Is there no way to make a track°dONLNdûht;(ê6louder?°dONLNd¶tÄ$* __°dONLNd©åòk*Here’s the scoop:°dONLNdª§∞n*JThe volume is described as a small fract 8:8 and its values go from -1 to °dONLNd§n∞⁄(Ãå1 with negative values°dONLNd∞º%(ÿ6as °dONLNd∞%º⁄)
  560. Splaceholders. The maximum volume you can get is 0x0100 with the minimum being 0 (or°dONLNdsº»Ω(‰6Vany negative value). The advantage of using negative volumes is that you can turn off °dONLNd…ºΩ»⁄(‰€sound°dONLNdœ»‘Ã(6[while maintaining the level of volume. For example, -1 and 0 both equate to no volume, but °dONLNd*»Ñ⁄(Íthe°dONLNd.‘‡‘(¸6\-1 implies that 1 should be the volume when sound is turned back on, whereas the 0 does not.°dONLNdãϯÃ*\The volume for a track is scaled to the movie’s volume, and the movie’s volume is scaled to °dONLNdÁÏï⁄(Íthe°dONLNdί%( 6:value the user specifies for the speaker volume using the °dONLNd%¯%⁄( C$Sound control panel. This means that°dONLNdJã(,6Kthe movie volume represents the maximum loudness of any track in the movie.
  561. °dONLNdñ(7 *'"QuickTime 1.0 FS6Patch elucidation
  562. °dONLNdπ7C>* Written:°dONLNd√CO]* Last reviewed:°dONLNd”[gj*DThe FS6Patch description in the QuickTime 1.0 CD Read Me file says, °dONLNd[jg⁄(Éà“There is a known bug°dONLNd-gs´(è6Owith HFS on System 6.” What specifically is this bug? According to the Read Me °dONLNd|g´s⁄(è…
  563. file, “The°dONLNdás7(õ6;exact situation under which the problem occurs is somewhat °dONLNd¬s7⁄(õU#rare.” What is the exact situation?°dONLNdÊãM(ß6B“If the patch is not necessary, it will not install itself.” What °dONLNd(Mã⁄(ßkcriteria is used to determine°dONLNdFãóH(≥6
  564. necessity?°dONLNdQó£** ___°dONLNdUت≠* When closing or flushing a file °dONLNduØ≠ª⁄)ïAthat has multiple open paths to a given fork, it is possible that°dONLNd∑ª«f(„6Ithe blocks marked as available for the other paths can also be allocated °dONLNdªf«⁄(„Ñto the other fork. If this°dONLNd«”d(Ô6Ahappens before the other paths are closed, blocks will be mapped °dONLNd\«d”⁄(ÔÇto more than one fork,°dONLNds”fl‘(˚6*potentially trashing at least one of them.°dONLNdûΘπ*$The condition that can trigger this °dONLNd¬Îπ˜⁄)°<condition is multiple writeable paths to the same fork. Once°dONLNdˇ˜ó(6this is satisfied you would °dONLNd˜ó⁄)Aneed to make some changes to the fork, close the path, use any of°dONLNd]g(+6Ethe other paths to modify the fork, access the other fork and modify °dONLNd¢g⁄(+Ödata. If all these things°dONLNdºª(76Xhappen you could see the damage to one of the forks (the second-to-last being accessed).°dONLNd'3ö*TThe code that loads the patch checks the system first; the range where the patch is °dONLNdi'ö3⁄(O∏
  565. used is 6.0.4°dONLNdw3?≠([6R< system < 7.0. The version of the ROM is also used to decide when to install. If °dONLNd…3≠?⁄([Àthe ROM°dONLNd—?K°(g6indicates the machine is later °dONLNd?°K⁄)â?than the Macintosh IIfx, then a fix in ROM is assumed. The last°dONLNd    0KW=(s6<check is to see if the code being patched is already in RAM °dONLNd    lK=W⁄(s[ (the assumption is that being in°dONLNd    çWc(64RAM means fixed). If so, the patch doesn’t get used. ◊4◊˘
  566. *m8) of 13(ÏúMovie Toolbox Q&Asˇn◊#ˇ ˇˇˇˇ#◊ 
  567. IR,Times
  568. .+Z-Developer Support Center(-fi
  569. December 1992 /X/
  570. °dONLNd)<8Œ(TZ9QuickTime alias and FSSpec system services under System 6
  571. °dONLNd:8<Db* Written:°dONLNdDD<PÅ* Last reviewed:°dONLNdT\<h`*>I recall reading that QuickTime includes an implementation of °dONLNdí\`h˛(Ñ~the Alias Manager for System 6,°dONLNd≤h<t™(êZNbut I haven’t found any precise description of just what is included. Is it a °dONLNdh™t˛(ê»bare minimum to°dONLNdt<ÄΔ(úZPsupport QuickTime? Or is the full Alias Manager there? Also, is there any way I °dONLNd`tΔIJ(ú‰ can use the°dONLNdlÄ<å∂(®ZQFSSpec interface to the File Manager, or must I revert to the System 6 interface?°dONLNdæå<òN* ___°dONLNd¬§<∞›* Here is some information on the °dONLNd‚§›∞˛)°8alias and FSSpec system services that QuickTime supplies°dONLNd∞<ºâ(ÿZunder System 6:°dONLNd+»<‘*-1. QuickTime support for aliases on System 6:°dONLNdY‡<Ït*BMost of the Alias Manager is available, with these few exceptions:°dONLNdú¯<@*•°dONLNdû¯E∂)    QNewAlias will accept a fromFile parameter, but it never creates a relative alias.°dONLNd<@(,Z•°dONLNdÚE*)    -NewAliasMinimalFromFullPath is not available.°dONLNd <@(8Z•°dONLNd"Eo)    AResolveAlias will accept a fromFile parameter, but it ignores it.°dONLNdd<(@(DZ•°dONLNdfE(€)     ResolveAliasFile is not present.°dONLNdá(<4@(PZ•°dONLNdâ(E4x)    2MatchAlias may be called, but the kARMSearchMore, °dONLNdª(x4˛(PñkARMSearchRelFirst, and°dONLNd”4<@ø(\ZQkARMMultVols flags are not available. If you pass them in, they will be ignored. °dONLNd$4ø@˛(\› Furthermore,°dONLNd1@<L((hZ4if you pass in a matchProc, it will never be called.°dONLNdfL<X@* •°dONLNdhLEXb)    =UpdateAlias will accept a fromFile parameter, but ignores it.°dONLNd¶X<d@(ÄZ•°dONLNd®XEdn)    :The System 6 Alias Manager will not mount network volumes.°dONLNd„p<|b(òZ7So to summarize, on System 6 the Alias Manager doesn’t °dONLNdpb|˛(òÄ!handle relative aliases, multiple°dONLNd<|<àè(§ZBvolume searches, searchMore searches, and network volume mounting.°dONLNdî<†Í*'On the good side, nearly all calls are °dONLNd¶î͆˛)Æ8present. Aliases created on System 6 are compatible with°dONLNdfl†<¨î(»ZESystem 7 aliases. And aliases made on System 7 will work on System 6.°dONLNd%∏<ƒˆ*\Unfortunately, QuickTime does not currently install an Alias Manager Gestalt selector as it °dONLNdÅ∏ˆƒ˛(‡is°dONLNdу<–Ô(ÏZ^only a partial implementation. You can check for the Alias Manager using Gestalt and if it is °dONLNd‚ƒÔ–˛(Ï
  572. not°dONLNdÊ–<‹(¯Z,present, look for QuickTime (using Gestalt) °dONLNd–‹˛)“/and if QuickTime is present, assume you have an°dONLNdB‹<Ë(Z0Alias Manager, subject to the limitations above.°dONLNdsÙ<Ó*%2. FSp file system calls and System 6°dONLNdô <â*QuickTime also °dONLNd® â˛)MKmakes extensive use of the FSSpec data structure introduced in the System 7°dONLNdÙ<$˜(@Z$File Manager. Nearly all the FSSpec °dONLNd˜$˛)ª1calls are available on System 6 when QuickTime is°dONLNdJ$<0G(LZ:installed. The following calls are available on System 6, °dONLNdÑ$G0˛(Le#and should behave as documented for°dONLNd®0<<k(XZ    System 7:°dONLNd≤H<Tï*    FSMakeFSSpec°dONLNd√T<`Ñ*
  573.     FSpOpenDF°dONLNd—`<lÑ*
  574.     FSpOpenRF°dONLNdfll<xz*
  575.     FSpCreate°dONLNdÌx<Ñâ*     FSpDirCreate°dONLNd˛Ñ<êy*
  576.     FSpDelete°dONLNd     ê<úà*     FSpGetFInfo°dONLNd    ú<®Ü*     FSpSetFInfo ◊X◊
  577. *(Movie Toolbox Q&As(Ïˇ9) of 13ˇN◊#ˇ ˇˇˇˇ#◊ 
  578. IR,Times
  579. .+6-Macintosh Technical Notes /4/˘
  580. °dONLNd)f*    FSpSetFLock°dONLNd)5g*     FSpRstFLock°dONLNd 5A^*
  581.     FSpRename°dONLNd.AMc*     FSpCatMove°dONLNd=MYu*     FSpOpenResFile°dONLNdPYez*     FSpCreateResFile°dONLNdeeqm*     FSpGetCatInfo°dONLNdw}âfi*)The following call is not available when °dONLNd†}fiâ⁄)Δ/using the QuickTime System 6 version of the FSp°dONLNd–âï0(±6calls:°dONLNd◊°≠}*    FSpExchangeFiles°dONLNdÏπ≈≠* Again, the Gestalt selector for °dONLNd π≠≈⁄)ï<the FSp calls is not installed when QuickTime is there. This°dONLNdI≈—(Ì66means that the gestaltFSAttr Gestalt selector may not °dONLNd≈—⁄(Ì9%be present, and gestaltHasFSSpecCalls°dONLNd•—›¯(˘61may not be set, even if gestaltFSAttr is present.
  582. °dONLNd◊ıÕ*'?'pnot' resource format for QuickTime-like preview in dialog box
  583. °dONLNd>* Written:°dONLNd!]* Last reviewed:°dONLNd1(4≥*UI would like to implement the preview/thumbnail feature in the Standard File dialog, °dONLNdÜ(≥4⁄(P—    just like°dONLNdê4@ª(\6Wthe extension included with QuickTime. Is that code available separate from QuickTime? °dONLNdÁ4ª@⁄(\ŸIf not,°dONLNdÔ@L<(h6?could I at least get information on how the preview is created?°dONLNd/LX** ___°dONLNd3dpç*To implement your own °dONLNdIdçp⁄)uEpreview/thumbnail feature, simply duplicate the Standard File dialog,°dONLNdèp|(ò62add the necessary 'DITL' resources, and install a °dONLNd¡p|⁄)Í,custom filter procedure for handling preview°dONLNdÓ|àt(§6commands. On the °dONLNdˇ|tà⁄)\ESystem 7 CD there’s an example, StdFileSample, that shows exactly how°dONLNdEàîL(∞6=to create a custom file dialog. The Macintosh Technical Note °dONLNdÇàLî⁄(∞j“Customizing Standard File”°dONLNdûî†g(º6D(formerly #47) describes how to do this as well. For generating and °dONLNd‚îg†⁄(ºÖdisplaying the preview,°dONLNd˙†¨Ñ(»6you can use the     °dONLNd
  584. †Ñ¨⁄)l8following PreviewResourceRecord, found at the end of the°dONLNdC¨∏ì(‘6ImageCompression.h file:,
  585. Courier
  586.     °dONLNd\ƒœÆ*struct PreviewResourceRecord {°dONLNd{ŒŸΩ*
  587. !    unsigned long        modDate;°dONLNdùÿ„—*
  588. %    short                    version;°dONLNd√‚̬*
  589. "    OSType                resType;°dONLNdÊϘ«*
  590. #    short                    resID;°dONLNd
  591. ˆ"*
  592. };
  593. °dONLNd
  594.  K*;typedef struct PreviewResourceRecord PreviewResourceRecord;°dONLNdI$Ü* Etypedef PreviewResourceRecord *PreviewResourcePtr, **PreviewResource;°dONLNdè0<Ä*NThis is the format for the 'pnot' resource, which defines the preview for the °dONLNd›0Ä<⁄(Xûmovie file, usually°dONLNdÒ<HC(d6    pointing °dONLNd˙<CH⁄)+Pto a 'PICT' resource. It’s all you need to generate QuickTime-compatible preview°dONLNdKHTî(p6without using QuickTime. ◊4◊˘
  595. *|10)
  596.  of 13(ÏúMovie Toolbox Q&Asˇ‰◊#ˇ ˇˇˇˇ#◊ 
  597. IR,Times
  598. .+Z-Developer Support Center(-fi
  599. December 1992 /X/
  600. °dONLNd)<8ä(TZ0MCSetClip and clipping with the movie controller
  601. °dONLNd18<Db* Written:°dONLNd;D<PÅ* Last reviewed:°dONLNdK\<h *-I use SetMovieDisplayClipRgn to set my movie °dONLNdx\ h˛)‰-clip, but the movie doesn’t obey my clipping.°dONLNd¶h<tO(êZ9Does the movie controller component ignore this clipping?°dONLNd‡t<ÄN* ___°dONLNd‰å<òS*You °dONLNdËåSò˛)Zprobably are directly modifying a movie that is attached to a controller without notifying°dONLNdCò<§é(¿ZLthe controller of the changes. The controller uses the display clip for its °dONLNdèò駲(¿¨own purposes, such as°dONLNd•§<∞r(ÃZ for badges.°dONLNd±º<»Ü*If you want to °dONLNd¿ºÜ»˛)JGdo clipping with the movie controller you must use MCSetClip. MCSetClip°dONLNd»<‘l(Z
  602. takes two °dONLNd»l‘˛)0Uregions. The first clips both the movie and the controller. The second clips just the°dONLNdh‘<‡(¸Z.movie, and is equivalent to the movie display °dONLNdñ‘‡˛)ÿ4clip. If both clips are set, the controller does the°dONLNdÀ‡<Ïb(Z>right thing and merges them as appropriate. If you don’t want °dONLNd    ‡bÏ˛(Ä"one or the other of the clips, set°dONLNd,Ï<¯z(Z
  603. them to zero.°dONLNd:<ó*LIn general, if you are going to do something to a movie that is attached to °dONLNdÜó˛(,µa controller you must°dONLNdú<ô(8Zeither do it through °dONLNd±ô˛)]Hthe controller, using the action calls, or you must call MCMovieChanged.°dONLNd˙<(ù(DZIOtherwise, the controller would need to constantly poll the movie to see °dONLNdCù(˛(Dªif its state changed.°dONLNdY(<4Î(PZ$Clearly this would be Evil and Slow.
  604. °dONLNd~L<[`*'*Problem with disabling a movie video track
  605. °dONLNd©[<gb* Written:°dONLNd≤[àg¨)L5/29/92°dONLNd∫g<sÅ(èZLast reviewed:°dONLNd…gàs¨)L9/15/92°dONLNd—<ã∏(ßZLWhen I disable a track in a movie, another random track becomes disabled as °dONLNd∏ã˛(ß÷well. Is this a°dONLNd-ã<óä(≥ZQuickTime bug?°dONLNd<ó<£N* ___°dONLNd@Ø<ªW*Yes, °dONLNdEØWª˛)Rthis problem will be fixed in the next QuickTime release. But, there’s no apparent°dONLNdòª<«„(„ZWworkaround in the meantime. You’ll need to remove the track since disable doesn’t work.
  606. °dONLNdfl<Óã*'1Determining whether a movie is set to loop or not
  607. °dONLNd"Ó<˙b* Written:°dONLNd+Óà˙¨)L8/11/92°dONLNd3˙<Å("ZLast reviewed:°dONLNdB˙à¨)L9/15/92°dONLNdJ<(:Z+How does Simple Player determine whether a °dONLNdu˛)€1movie is set to loop or not? Movie files that are°dONLNdß<*¿(FZOset to loop seem to have a string of 'LOOP' at the end of the 'moov' resource. °dONLNdˆ¿*˛(Ffi Does Simple°dONLNd*<6¶(RZPlayer check 'LOOP'?°dONLNd6<BN* ___°dONLNdN<Zÿ*!Simple Player identifies whether °dONLNd<NÿZ˛)ú<movies are set to loop by looking within the user data atoms°dONLNdyZ<fû(ÇZGfor the 'LOOP' atom, as you’ve noticed. It’s a 4-byte Boolean in which °dONLNd¿Zûf˛(Ǻa value of 1 means°dONLNd”f<r{(éZAstandard looping and a value of 0 means palindrome looping. Your °dONLNdf{r˛(éôapplications should add the°dONLNd0r<~∏(öZuser data 'LOOP' atom to °dONLNdIr∏~˛)|>the end of the movie when a user chooses to loop. We recommend°dONLNdà~<äx(¶Z this method °dONLNdî~xä˛)<Mas a standard mechanism for determining the looping status of a movie. If the°dONLNd‚ä<ñ(≤Z 'LOOP' atom °dONLNdÓäñ˛)CPdoesn’t exist, there’s no looping. The calls you need to access this information ◊X◊
  608. (ÏZMovie Toolbox Q&As(Ï˙11)
  609.  of 13ˇ
  610. “◊#ˇ ˇˇˇˇ#◊ 
  611. IR,Times
  612. .+6-Macintosh Technical Notes /4/˘
  613. °dONLNd)Ã*Rare GetMovieUserData, GetUserData, AddUserData, and RemoveUserData, as defined in °dONLNdRÃ)⁄(EÍthe°dONLNdV)5'(Q65Movie Toolbox chapter of the QuickTime documentation.
  614. °dONLNdåM\_*'-Determining QuickDraw video media pixel depth
  615. °dONLNd∫\h>* Written:°dONLNd√\dhà)L8/18/92°dONLNdÀht](ê6Last reviewed:°dONLNd⁄hdté)L10/11/92°dONLNd„Äå|(®6JHow do I get the pixel depth of a QuickTime video media for a given track?°dONLNd.åò** ___°dONLNd2§∞›*)The following sample code does the trick:,
  616. Courier
  617.     °dONLNd\º«Ü*#include <QuickDraw.h>°dONLNdsΔ—w*
  618. #include <Movies.h>°dONLNdá–€©*
  619. #include <ImageCompression.h>°dONLNd•‰Ô:*:Media GetFirstVideoMedia(Movie coolMovie,long *trackIndex)°dONLNd‡Ó˘*
  620. {°dONLNd‚¯ã*
  621.   Track  coolTrack=nil;°dONLNd˙
  622. ã*
  623.   Media  coolMedia=nil;°dONLNd r*
  624.   long  numTracks;°dONLNd%!|*
  625.   OSType  mediaType;°dONLNd:*5Ù*,  numTracks = GetMovieTrackCount(coolMovie);°dONLNdg4?b*
  626. B  for (*trackIndex=1; *trackIndex <= numTracks; (*trackIndex)++) {°dONLNd™>I0*
  627. 8    coolTrack = GetMovieIndTrack(coolMovie,*trackIndex);°dONLNd„HS0*
  628. 8    if (coolTrack) coolMedia = GetTrackMedia(coolTrack);°dONLNdR]î*
  629. L    if (coolMedia) GetMediaHandlerDescription(coolMedia,&mediaType,nil,nil);°dONLNdi\g&*
  630. 6    if (mediaType == VideoMediaType) return coolMedia;°dONLNd†fq'*
  631.   }°dONLNd§p{Í*
  632. *  *trackIndex=0;  // trackIndex can’t be 0°dONLNdœzÖ0*
  633. 8  return nil;    // went through all tracks and no video°dONLNdÑè*
  634. }°dONLNd
  635. ò£*3short GetFirstVideoTrackPixelDepth(Movie coolMovie)°dONLNd>¢≠*
  636. {°dONLNd@¨∑ã*
  637. SampleDescriptionHandle°dONLNdX∂¡N*
  638. >imageDescH=(SampleDescriptionHandle)NewHandle(sizeof(Handle));°dONLNdó¿À§*
  639. long           trackIndex=0;°dONLNd¥ ’©*
  640. Media          coolMedia=nil;°dONLNd“fiÈ&*6coolMedia = GetFirstVideoMedia(coolMovie,&trackIndex);°dONLNd    ËÛ:*
  641. :if (!trackIndex || !coolMedia) return -1;  // we need both°dONLNdDÚ˝?*
  642. ;GetMediaSampleDescription(coolMedia,trackIndex,imageDescH);°dONLNdÄ*4return (*(ImageDescriptionHandle)imageDescH)->depth;°dONLNdµ*
  643. } ◊4◊˘
  644. *µ12)
  645.  of 13(ÏúMovie Toolbox Q&Asˇ‹◊#ˇ ˇˇˇˇ#◊ 
  646. IR,Times
  647. .+Z-Developer Support Center(-fi
  648. December 1992 /X/
  649. °dONLNd)<8ø(TZ6QuickTime 1.0 GetMoviePict grayscale images -157 error
  650. °dONLNd78<Db* Written:°dONLNd@8àD¨)L8/27/92°dONLNdHD<PÅ(lZLast reviewed:°dONLNdWDàP≤)L10/11/92°dONLNd`\<h¥(ÑZLTrying to read any single frame (except the first) from a grayscale (4, 16, °dONLNd¨\¥h˛(Ñ“or 256 grays),°dONLNdªh<tÓ(êZQuickTime movie gives a -157 °dONLNdÿhÓt˛)≤0error (invalid pixel depth). I do “framehandle =°dONLNd    t<Äo(úZAGetMoviePict(damovie,daunitnum)” and test if it’s 0. If so, then °dONLNdJtoIJ(úçI do “io = GetMoviesError()”°dONLNdgÄ<åQ(®Zand °dONLNdkÄQå˛)Vit gives me the -157 error. GetMoviePict is working fine for all color and black/white°dONLNd¬å<ò≠(¥ZLmovies. It just doesn’t work on “Animation” grayscale and “Video” grayscale °dONLNdå≠ò˛(¥Àmovies. Is this a°dONLNd ò<§S(¿Zbug?°dONLNd%§<∞N* ___°dONLNd)º<»Í*[It is true that grayscale images will cause a -157 error with GetMoviePict using QuickTime °dONLNdѺÍ»˛(‰1.0.°dONLNdâ»<‘:(Z4QuickTime 1.5 will fix this problem. Some grayscale °dONLNdΩ»:‘˛)˛(images may work, if the color tables are°dONLNdÊ‘<‡a(¸Zcustom °dONLNdÌ‘a‡˛)%Umade. To check for this situation, you can look at the clutID of the ImageDescription°dONLNdC‡<ϧ(ZLstructure. If the clutId is 0, then there is a custom color table attached. °dONLNdè‡§Ï˛(¬For these images,°dONLNd°Ï<¯¥(ZGetMoviePict may work. ◊X◊
  651. (ÏZMovie Toolbox Q&As(Ï˙13)
  652.  of 13ˇJ◊#ˇ ˇˇˇˇ#◊†Ç 
  653. /ZÅ#
  654.     0Ià:µú9"{    ˇˇˇˇˇˇˇˇ#†ƒ°d
  655. ONLNf˛†å°d1drw2…-·_ġˇˇˇˇˇè°ñ x°ddrw2:°ddrw2:$°d4drw2:°öˇ˙ó@†ò,Times
  656. .R…R…+]BNew Technical Notes†ô°ddrw2:°„†ó°d1drw2eÙġˇˇˇˇˇP°ñ x°ddrw2:°ddrw2:$°d4drw2:°öˇ˚ÄE¿†ò
  657. ({ïDeveloper Support†ô°ddrw2:°„†ó°d`drw2-ÔˇˇˇˇˇˇKÔ- Z  ffZ°d1drw2 ¿˙ÈˇˇˇˇˇˇK°ñ x°ddrw2:°ddrw2:$°d4drw2:0°öˇÙĆò
  658. 0(UÔ†ô°ddrw2:°„†ó°d1drw2ÔÊ˙ˇˇˇˇˇˇ°ñ x°ddrw2:°ddrw2:$°d4drw2:    °öˇ˝Ä†ò
  659.     +&    ®†ô°ddrw2:°„†ó°d1drw2Â-¯yˇˇˇˇˇˇ°ñ x°ddrw2:°ddrw2:$°d4drw2:°öˇ˚Ä%†ò
  660. (Z\    Macintosh†ô°ddrw2:°„†ó†ç°ddrw2D†É
  661. IR.°dONLNdz<çX(ßZMovies ‘LOOP’ Atom and Friends
  662. °dONLNdå<õÖ*    QuickTime°dONLNd)åzõ˛(∑òM.QT.MoviesLOOP
  663. °dONLNd9ß<≥q(œZ Written by:°dONLNdEßÑ≥∫)H    John Wang°dONLNdOß±≥˛(œœ
  664. November 1992°dONLNd]ø<Àh(ÁZ>This Technical Note discusses entertaining uses for QuickTime °dONLNdõøhÀ˛(ÁÜuser data atoms, Apple defined°dONLNd∫À<◊Ç(ÛZand otherwise.°dONLNd…„<Ôb*Topics°dONLNd–ÔW˚≠+ • User Data Types°dONLNd‚˚Wù*
  665. • Sample Code°dONLNdW€* • Inside the User Data Atom >X>
  666. °dONLNd 8<Gè(cZ Introduction
  667. °dONLNdS<_˘*^It is often desirable for an application to preserve the window position and looping state of °dONLNdwS˘_˛({a°dONLNdy_<kÙ(áZ&movie.  This Technical Note describes °dONLNdü_Ùk˛)∏6the “Apple Sanctified” method of doing this using user°dONLNd÷k<wr(ìZ data atoms.°dONLNd‰É<èµ*LUser data atoms allow applications to store custom information which can be °dONLNd0ɵè˛(´”easily accessed°dONLNd@è<õº(∑ZMusing QuickTime Movie Toolbox calls.  These user data atoms are text or data °dONLNdçèºõ˛(∑⁄ which can be°dONLNdöõ<ß5(√Z5associated and stored in any movie, track, or media. °dONLNdœõ5߲)˘+ A reference to the list of user data atoms°dONLNd˚ß<≥e(œZ    for each °dONLNdße≥˛))Sof these locations can be accessed with the following routines: GetMovieUserData(),°dONLNdX≥<øô(€ZHGetTrackUserData(), and GetMediaUserData().  Once a reference to a list °dONLNd†≥ôø˛(€∑of user data atoms is°dONLNd∂ø<Àj(ÁZ?obtained, an application can store, retrieve, and manage items °dONLNdıøjÀ˛(Áàin the list using the following°dONLNdÀ<◊b(ÛZ7routines:  GetNextUserDataType(), CountUserDataType(), °dONLNdLÀb◊˛(ÛÄAddUserData(), GetUserData(),°dONLNdj◊<„(ˇZPRemoveUserData(), AddUserDataText(), GetUserDataText, and RemoveUserDataText(). °dONLNd∫◊„˛(ˇ A°dONLNdΩ„<Ôj( Z    complete °dONLNdΔ„jÔ˛).Pdescription of these routines can be found in Inside Macintosh: QuickTime in the°dONLNdÔ<˚@(Z4“Working With Movie User Data” section of chapter 2.
  668. °dONLNdL<"™*'User Data Types
  669. °dONLNd\.<:á*KEvery user data atom carries a type identifier.  This identifier is stored °dONLNdß.á:˛(V•in a long integer, similar°dONLNd¬:<Fá(bZ>to a Resource Manager type.  Apple has reserved all lowercase °dONLNd:áF˛(b•user data types values.°dONLNdF<R¥(nZSApplications are free to use types values containing at least one uppercase letter.°dONLNdm^<jI*In °dONLNdp^Ij˛)
  670. \addition, since there is a differentiation between user data atoms which are handles to data°dONLNdÕj<v/(íZ4and handles to text, Apple recommends that all text °dONLNdj/v˛)Û*user data atoms begin with the © character°dONLNd,v<Çu(ûZ (Option-G).°dONLNd8é<öç*IThe following user data types containing text data are currently defined: ◊X◊
  671. *6Movies ‘LOOP’ Atom and Friends(Ï1) of 3ˇ°¿Ù%%DSIDICT:_cv
  672. currentdict /bu known {bu}if
  673. userdict /_cv known not{userdict /_cv 30 dict put}if
  674. _cv begin
  675. /bdf{bind def}bind def
  676. currentscreen/cs exch def/ca exch def/cf exch def
  677. /setcmykcolor where{/setcmykcolor get /cvcmyk exch def}{/cvcmyk{1 sub 4 1 roll 3{3 index add neg dup 0 lt{pop 0}if 3 1 roll}repeat setrgbcolor pop}bdf }ifelse
  678. /ss{//cf //ca //cs setscreen}bdf
  679. /stg{ss setgray}bdf
  680. /strgb{ss setrgbcolor}bdf
  681. /stcmyk{ss cvcmyk}bdf
  682. /min1{dup 0 eq{pop 1}if}bdf
  683. end
  684. currentdict /bn known {bn}if
  685. †ø◊#ˇ ˇˇˇˇ#◊ 
  686. IR,Times
  687. .+6-Macintosh Technical Notes /4/˘
  688. °dONLNd<)^+$'©cpy'°dONLNd®))lCopyright statement°dONLNd)<5^(QZ'©day'°dONLNd%)®5M)l"Date the movie content was created°dONLNdI5<AZ(]Z'©dir'°dONLNdR5®A2)lName of the movie's director°dONLNdpA<Mè(iZ'©ed1' to '©ed9'°dONLNdÅA®M&)lEdit dates and descriptions°dONLNdûM<Y](uZ'©fmt'°dONLNd¶M®Y—)l?Indication of the movie format (computer-generated, digitized, °dONLNdÈY®e⁄*
  689. and so on)°dONLNdıe<qZ(çZ'©inf'°dONLNd˛e®q.)lInformation about the movie°dONLNdq<}a(ôZ'©nam'°dONLNd#q®})lName of track or movie°dONLNd;}<â](•Z'©prd'°dONLNdC}®âW)l#Name of the writer movie's producer°dONLNdhâ<ï[(±Z'©prf'°dONLNdqâ®ï)lName of the performers°dONLNdâï<°\(ΩZ'©req'°dONLNdëï®°r)l)Special hardware or software requirements°dONLNdº°<≠[(…Z'©src'°dONLNd≈°®≠¥)l7Credits for those who provided the movie source content°dONLNd˛≠<π](’Z'©wrt'°dONLNd≠®π )lName of the movie's°dONLNd≈—~(Ì6Getting 'LOOP'-y°dONLNd+›ȱ*MoviePlayer™ has also defined °dONLNdI›±È⁄)ô;two movie data atoms which are used to indicate looping and°dONLNdÖÈıD(6window °dONLNdåÈDı⁄),Nlocation which applications can implement for compatibility with MoviePlayer™.°dONLNd‹ıD(6    They are:°dONLNdÁ
  690. <b+$'LOOP'°dONLNdÓ
  691. Ã>)êIf this 4 byte user data °dONLNd
  692. >⁄)ratom exists in the movie's user°dONLNd'Ã%˝(AÍ data list, °dONLNd2˝%⁄)1*then looping is performed according to its°dONLNd]%Ã1⁄(MÍ8value: 0 for normal looping and 1 for palindrome looping°dONLNdó1<=f(YZ'WLOC'°dONLNdû1Ã=¶)ê(Handle to a point record indicating the °dONLNdΔ1¶=⁄)⁄
  693. last saved°dONLNd—=ÃI(eÍwindow position°dONLNd·UaË(}6+Another variation on this which originated °dONLNd UËa⁄)–/before MoviePlayer™ that applications should be°dONLNd<amï(â6aware of, is the following:°dONLNdYy<Öb+$'LOOP'°dONLNd`yÃÖ&)êIf this zero length °dONLNdty&Ö⁄)Z$data atom exists in the movie's user°dONLNdôÖÃëô(≠Í,data list, then normal looping is performed.°dONLNdΔù©Ê(≈6*In summary, if a 'LOOP' atom exists, then °dONLNdùÊ©⁄)Œ2looping should be performed.  If the returned data°dONLNd#©µà(—6Kis a long integer of value 1, then palindrome looping should be performed. °dONLNdn©àµ⁄(—¶ Normal looping°dONLNd~µ¡~(›6Oshould be performed if data returned is of zero length or if the returned data °dONLNdÕµ~¡⁄(›úis a long integer of°dONLNd‚¡Õ>(È6value 0.
  694. °dONLNdÎÂÙm*' Sample Code
  695. °dONLNd˜ °*OThe following example demonstrates how to get looping information from a movie:
  696.     °dONLNdG#R*T    short        loopInfo;    //  0=no looping,1=normal looping,2=palindrome looping°dONLNdú,7k*    Handle       theLoop;°dONLNd∂6Aq*
  697.     Movie        theMovie;°dONLNd—@K}*
  698.     UserData     theUserData;°dONLNdÔT_S*    loopInfo = 0;°dONLNd^iÅ*
  699.     theLoop = NewHandle(0);°dONLNdhsÕ*
  700. -    theUserData = GetMovieUserData(theMovie);°dONLNdKr}”*
  701. 1    if (CountUserDataType(theUserData, 'LOOP')) {°dONLNd}|á[*
  702.         loopInfo = 1;°dONLNdìÜë‹*
  703. 5        GetUserData(theUserData, theLoop, 'LOOP', 1);°dONLNd…êõì*
  704. #        if (GetHandleSize(theLoop))°dONLNdÌö•©*
  705. ,            if ((** (long **) theLoop) == 1)°dONLNd§Øk*
  706.                 loopInfo = 2;*
  707.     } ◊4◊˘
  708. *2) of 3(ÏmMovies ‘LOOP’ Atom and Friendsˇ Ç◊#ˇ ˇˇˇˇ#◊ 
  709. IR,Times
  710. .+Z-Developer Technical Support(-fi
  711. December 1992 /X/
  712. °dONLNd)<5’(QZTThe following example demonstrates how to add a looping atom to a movie to indicate °dONLNdT)’5˛(QÛ    that user°dONLNd^5<Aû(]Zhas selected looping:
  713.     °dONLNdtM<Xè*    Handle       theLoop;°dONLNdéW<bï*
  714.     Movie        theMovie;°dONLNd©a<l°*
  715.     UserData     theUserData;°dONLNd«k<vé*
  716.     short        theCount;°dONLNd‚<äœ*&    theLoop = NewHandle(sizeof(long));°dONLNd    â<î≠*
  717.     (** (long **) theLoop) = 0;°dONLNd)ì<ûÒ*
  718. -    theUserData = GetMovieUserData(theMovie);°dONLNdWù<®*
  719. 6    theCount = CountUserDataType(theUserData, 'LOOP');°dONLNdéß<≤ä*
  720.     while (theCount--)°dONLNd•±<ºÌ*
  721. /        RemoveUserData(theUserData, 'LOOP', 1);°dONLNd’ª<ΔÔ*
  722. .    AddUserData(theUserData, theLoop, 'LOOP');
  723. °dONLNd—<›Ç*The following °dONLNd—Ç›˛)FJexample demonstrates how to remove a looping atom from a movie to indicate°dONLNd]›<Ⱥ(Zthat looping is not selected:
  724.     °dONLNd|ı<ï*    Movie        theMovie;°dONLNdóˇ<
  725. °*
  726.     UserData     theUserData;°dONLNdµ    <é*
  727.     short        theCount;°dONLNd–<(Ò*-    theUserData = GetMovieUserData(theMovie);°dONLNd˛'<2*
  728. 6    theCount = CountUserDataType(theUserData, 'LOOP');°dONLNd51<<ä*
  729.     while (theCount--)°dONLNdL;<FÌ*
  730. /        RemoveUserData(theUserData, 'LOOP', 1);
  731. °dONLNdÖg<vÌ*0Inside the User Data Atom
  732. °dONLNdüÇ<é *OThose of you who parse user data atoms directly by accessing the 'moov' handle °dONLNdÓÇ é˛(™Ë rather than°dONLNd˙é<öe(∂Z    with the °dONLNdéeö˛))Yappropriate movie toolbox calls, will notice a trailing long integer of value 0 after all°dONLNd]ö<¶&(¬Z3user data atoms in the list.  This is required for °dONLNdêö&¶˛)Í)backward compatibility with QuickTime 1.0°dONLNd∫¶<≤(ŒZ0which has a bug that requires the trailer.  The °dONLNdͶ≤˛)‚/size of the 'udta' atom does reflect this extra°dONLNd≤<æŒ(⁄ZTtrailing long integer.  QuickTime 1.0 and future versions will automatically handle °dONLNdn≤Œæ˛(⁄Ï    this when°dONLNdxæ< Q(ÊZ:manipulating user data atoms with the movie toolbox calls.°dONLNd¥Ó<˙¶*0Further Reference: X°dONLNd«˚NR+
  733. •°dONLNd…˚`Î)Inside Macintosh: QuickTime°dONLNd‰˚Îm)ã, Movie Toolbox Reference ◊X◊
  734. (ÏZMovies ‘LOOP’ Atom and Friends(Ï3) of 3ˇ